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.整个指导.
任何随机序列都必然会发生一些碰撞.这只是时间问题.使用具有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放在某处以避免每次都创建一个新的.
这是另一个版本
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)
它保证是独一无二的!