GUID的哈希值是否唯一?

时间:2020-03-06 14:46:17  来源:igfitidea点击:

我创建一个GUID(作为字符串)并获取其哈希值。我可以认为此哈希是唯一的吗?

解决方案

没有GUID本身可靠的唯一性。

只是为了扩展,我们将唯一性降低了4倍,从16个字节减少到4个字节(可能的组合)。

正如评论中指出的那样,散列大小会有所不同。 4字节是一个假设,我最多也知道这很可怕,它可能会在.NET中使用,默认哈希值是4字节(int)。因此,我们可以将我上面所说的内容替换为散列可能是任何字节大小。

由于哈希冲突,因此不保证如此。 GUID本身几乎可以保证。

出于实际原因,我们可能会认为哈希是唯一的,但是为什么不使用GUID本身呢?

没有。

如果需要迷你GUID,请参见此处:http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

一言以蔽之。

假设哈希值比GUID少,根据信鸽原理,某些GUID->哈希表必须存在多个映射,这仅仅是因为哈希数少于GUIDS。

如果我们假设散列的位数比GUID大,那么假设我们使用的是良好的散列函数,则碰撞的机会非常小(但有限)。

没有将任意大小的数据块减少到固定大小的位数的哈希函数将不会在两者之间产生1对1的映射。总是有机会将两个不同的数据块简化为哈希中的相同位序列。

好的哈希算法可以最大程度地减少这种情况的发生,并且通常,哈希中的位数越多,发生冲突的机会就越少。

不,我不会假设任何哈希值都是唯一的。没关系,因为哈希值不需要唯一,它们仅需要在其范围内均匀分布即可。分布越均匀,发生的冲突就越少(在哈希表中)。更少的冲突意味着更好的哈希表性能。

为了更好地描述哈希表的工作原理,请阅读对什么是哈希表和哈希图及其典型用例的公认答案。

如果我们使用加密哈希(MD5,SHA1,RIPEMD160),则哈希将是唯一的(模态冲突非常不可能-SHA1用于例如数字签名,而MD5在随机输入上也具有抗冲突性)。但是,为什么要哈希GUID?