问题:当你有一个用于插入数据库的.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或尽可能接近。
答案 0 :(得分:2)
如果空间不是问题,那么为什么不使用2个64位宽的列,然后使用8字节将guid分成两半,然后将它们转换为64位数字并将其存储在2列中,如果你确实需要升级到另一个系统,你仍然是唯一的,你只需要考虑重新加入2列。
答案 1 :(得分:1)
实际上,.NET生成的GUID是6个固定位和122位随机性。
您可以考虑仅使用64位随机性,由于较小的位长度而导致冲突的可能性增加。它会比哈希更好。
答案 2 :(得分:0)