本地唯一标识符

Ste*_*ger 5 .net c# 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
Run Code Online (Sandbox Code Playgroud)

现在我的 GUID 有问题,因为它是 128 位数字,而我使用的一些 DB 仅支持 64 位数字。

现在我不想通过使用自动增量 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
Run Code Online (Sandbox Code Playgroud)

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

现在我的问题是:1)您是愿意增加主机名哈希位大小并减少随机位大小,还是增加随机位大小并减少主机名哈希位大小。

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

Ste*_*ary 2

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

您可以考虑仅使用 64 位随机性,由于位长度较小,因此发生冲突的可能性会增加。它会比哈希工作得更好。