如何生成唯一的8位数?

dev*_*dev 17 c# numbers unique

我正在使用此代码生成一个8位数的唯一编号.

byte[] buffer = Guid.NewGuid().ToByteArray();
return BitConverter.ToUInt32(buffer, 8).ToString();
Run Code Online (Sandbox Code Playgroud)

此代码是否真的生成一个唯一的数字,或者它可能会再次重复相同的数字?

Mar*_*len 10

GUID不仅仅是一个随机数; 它由细分组成.如果在同一台计算机上生成guid,则某些段将不会发生任何变化.通过仅使用原始128位的64位,您将破坏guid的结构,并且最有可能打破生成的数字的唯一性.

这个问题有关于guids唯一性的更多信息,请查看此链接以获取更多信息,了解如果您需要一个唯一编号,仅使用部分guid是不好的.

如果您需要将重复限制到绝对最小值,增量计数器将为您提供所需的.如果您的应用程序使用多个线程或进程,则计数器可能很难(甚至不可能)正确实现.

这是guids设计的领域,在多台机器上是独一无二的.因此,如果要求跨机器的唯一性,则应使用guids.整个指导.


Can*_*cer 9

任何随机序列都必然会发生一些碰撞.这只是时间问题.使用具有100,000,000个可能值(8位数)的生日悖论公式,您与仅10,000个元素发生碰撞的可能性大约为40%,99%具有30,000个元素.(见这里的计算器).

如果您确实需要随机序列,则不应为此目的使用GUID.GUID具有非常特定的结构,只能作为一个整体.很容易创建一个随机的8位序列发生器.这应该给你一个8位数的序列:

 public string Get8Digits()
 {
   var bytes = new byte[4];
   var rng = RandomNumberGenerator.Create();
   rng.GetBytes(bytes);
   uint random = BitConverter.ToUInt32(bytes, 0) % 100000000;
   return String.Format("{0:D8}", random);
 }
Run Code Online (Sandbox Code Playgroud)

您还可以将RandomNumberGenerator放在某处以避免每次都创建一个新的.

  • 真的,这绝不是重复的.或者在2或4年后重复......请告诉.... (2认同)

Kam*_*dir 5

这是另一个版本

public static string GetFormNumber()
    {
        byte[] buffer = Guid.NewGuid().ToByteArray();
        var FormNumber = BitConverter.ToUInt32(buffer, 0) ^ BitConverter.ToUInt32(buffer, 4) ^ BitConverter.ToUInt32(buffer, 8) ^ BitConverter.ToUInt32(buffer, 12);
        return FormNumber.ToString("X");

    }
Run Code Online (Sandbox Code Playgroud)

它保证是独一无二的!

  • 使用 linqpad 为 1000000 条记录生成它并得到 119 个重复项。为相同数量的记录再生成几次,重复计数通常为 110 和 200。不过仍然令人印象深刻。如果只有一种方法可以删除重复项而无需与以前保存的值进行比较。使用的代码是`Enumerable.Range(1,1000000).Select(x=>GetFormNumber()).GroupBy(x => x).Where(x=>x.Count()>1).Dump();` (7认同)