【发布时间】:2011-05-23 22:09:39
【问题描述】:
我正在使用此代码生成一个 8 位唯一编号。
byte[] buffer = Guid.NewGuid().ToByteArray();
return BitConverter.ToUInt32(buffer, 8).ToString();
这段代码真的会生成一个唯一的数字,还是会再次重复相同的数字?
【问题讨论】:
-
您可能需要进一步讨论您的要求;为什么
static counter=0; counter++; sprintf(buffer,"%8d", counter);这样的代码不能完成这项工作?是否必须从 GUID 生成?应该有任何类型的数字分布吗? -
没有必要使用 GUID。我使用 GUID 的唯一原因是因为我找到了一些关于 GUID 的好文章,这就是我使用 GUID 的原因。但是如果您有任何其他方式来生成唯一编号,请告诉我。
-
GUID 不是唯一的,它只是不太可能产生两个相同的序列。通过将 GUID 减少到 8 位数字,您可以显着增加重复的机会。请进一步说明您需要唯一编号;如果你想要一个随机数,你不应该使用 GUID,如果你想要一个主键值,你可能应该只增加一个计数器,以确保在重复自己之前使用可用的最大数字范围(你会知道,因为它会抛出一个溢出异常)。
-
到目前为止,似乎没有一个答案能够解决问题的唯一性要求。
-
使用jeff.aaron.ca/cgi-bin/birthday,在 8 位数字空间中只有 10,000 个条目发生冲突的几率为 40%。但是,我们仍然不知道这些数字的意图是什么。