如何确定性地在 GUID 的范围内生成 n 个唯一编号



一个具体的例子。

如果我的范围是 1-300,如何使用 GUID "EDAAE218-FBF0-4B66-AEAF-FB036FBF69F4" 在该范围内生成 5 个唯一数字。 将相同的算法应用于 GUID 应导致每次选择相同的 5 个数字。

输入不必是 GUID,它只是充当某种键。

我试图解决的问题的一些背景。我有一个硬编码的值列表,其中包含大约 300 个左右的元素。我正在尝试找到一种方法来从此列表中选择始终产生相同元素的 20 个元素。

我的想法是生成一个可以分发给多个用户的 GUID。当这些用户将 GUID 输入到应用中时,将为每个人返回相同的 20 个元素。

guid 实际上是一个 128 位数字。因此,只要表示数字所需的位数少于 guid 中的位数 (128(,则可以轻松执行此操作。您不需要对 guid 或类似的东西进行哈希处理。

编辑:

现在我知道你需要什么(即从 guid 派生的唯一种子,你可以这样做( - 但你同样可以分发一个 32 位数字并避免 guid 到 int 的转换。

编辑2:根据上面评论中的建议使用GetHashCode。

编辑3:生成唯一编号。

 static void Main(string[] args)
 {
     var guid = new Guid("bdc39e63-5947-4704-9e12-ec66c8773742");
     Console.WriteLine(guid);
     var numbers = FindNumbersFromGuid(guid, 16, 8);
     Console.WriteLine("Numbers: ");
     foreach (var elem in numbers)
     {
         Console.WriteLine(elem);
     }
     Console.ReadKey();
 }
 private static int[] FindNumbersFromGuid(Guid input,
     int maxNumber, int numberCount)
 {
     if (numberCount > maxNumber / 2) throw new ArgumentException("Choosing too many numbers.");
     var seed = input.GetHashCode();
     var random = new Random(seed);
     var chosenSoFar = new HashSet<int>();
     return Enumerable.Range(0, numberCount)
         .Select(e =>
         {
             var ret = random.Next(0, maxNumber);
             while (chosenSoFar.Contains(ret))
             {
                 ret = random.Next(0, maxNumber);
             }
             chosenSoFar.Add(ret);
             return ret;
         }).ToArray();
 }

最新更新