本地唯一标识符

时间:2010-08-14 22:29:18

标签: c# .net vb.net guid uniqueidentifier

问题:当你有一个用于插入数据库的.NET GUID时,它的结构是这样的:

60 bits of timestamp, 
48 bits of computer identifier,
14 bits of uniquifier, and
 6 bits are fixed, 
----
128 bits total

现在我遇到GUID问题,因为它是一个128位的数字,而我使用的一些数据库只支持64位数字。

现在我不想通过使用autoincrement bigint值来解决这个难题,因为我希望能够进行离线复制。

所以我想到了创建一个本地唯一的标识符类,它基本上是一个缩小到64位值的GUID。

我想出了这个:

day  9 bit (12*31=372 d)
year 8 bit (2266-2010 = 256 y)
seconds  17 bit (24*60*60=86400 s)
hostname 12 bit (2^12=4096)
random 18 bit (2^18=262144)
------------------------
          64 bits total

我现在的问题是:时间戳几乎固定为34位,主机名+随机数为64-34 = 30位。

现在我的问题: 1)您是希望增加hostname-hash bitsize并减少随机bitsize,还是增加随机bitsize并减少hostname-hash bitsize。

2)是否存在将每个字符串减少为n-bit的哈希算法? n理想情况下= 12或尽可能接近。

3 个答案:

答案 0 :(得分:2)

如果空间不是问题,那么为什么不使用2个64位宽的列,然后使用8字节将guid分成两半,然后将它们转换为64位数字并将其存储在2列中,如果你确实需要升级到另一个系统,你仍然是唯一的,你只需要考虑重新加入2列。

答案 1 :(得分:1)

实际上,.NET生成的GUID是6个固定位和122位随机性。

您可以考虑仅使用64位随机性,由于较小的位长度而导致冲突的可能性增加。它会比哈希更好。

答案 2 :(得分:0)

为什么要自己写?为什么不生成一个统一的随机数?它会很好地完成这项工作。只需抓住前X个数字,其中X是你想要的任何大小......比如说64位。

有关SQL Server中RAND()NEWID()的信息,请参阅here,这实际上只是对GUID与随机数生成器的起诉。另外,如果您需要比System.Random更随机的内容,请参阅here