Hash GUID的哈希是否唯一?

Hash GUID的哈希是否唯一?,hash,guid,unique,Hash,Guid,Unique,我创建一个GUID(作为字符串)并获取它的哈希值。我能认为这个哈希是唯一的吗?< /p> 不像GUID本身那样可靠,No.< 只是为了扩展,您将您的唯一性减少了4倍,从16字节减少到4字节的可能组合 正如注释中指出的,散列大小将产生不同。4字节的事情是一个假设,据我所知,它可能会在.NET中使用,默认的散列大小是4字节(int)。因此,您可以用哈希可能的任何字节大小替换我上面所说的内容。由于哈希冲突,无法保证它的大小。GUID本身几乎可以保证是安全的 出于实际原因,您可能可以假设哈希是唯一的,但

我创建一个GUID(作为字符串)并获取它的哈希值。我能认为这个哈希是唯一的吗?< /p> 不像GUID本身那样可靠,No.< 只是为了扩展,您将您的唯一性减少了4倍,从16字节减少到4字节的可能组合


正如注释中指出的,散列大小将产生不同。4字节的事情是一个假设,据我所知,它可能会在.NET中使用,默认的散列大小是4字节(int)。因此,您可以用哈希可能的任何字节大小替换我上面所说的内容。

由于哈希冲突,无法保证它的大小。GUID本身几乎可以保证是安全的

出于实际原因,您可能可以假设哈希是唯一的,但为什么不使用GUID本身呢?

请参见此处,如果您想要迷你GUID:

总之,不需要

让我们假设您的哈希比GUID的位数少,根据鸽子洞原理,必须存在多个GUID->哈希的映射,因为哈希比GUID少


如果我们假设散列的位数大于GUID,那么假设您使用的是好的散列函数,则发生冲突的可能性很小,但有限。

将任意大小的数据块减少到固定大小的位数的散列函数都不会在这两者之间产生1对1的映射。在散列中始终存在将两个不同数据块缩减为相同比特序列的可能性


好的散列算法会将发生这种情况的可能性降至最低,通常,散列中的位数越多,冲突的可能性就越小。

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


为了更好地描述哈希表的工作原理,请阅读对

的公认答案。如果使用加密哈希(MD5、SHA1、RIPEMD160),哈希将是唯一的(模冲突非常不可能——SHA1用于数字签名,MD5在随机输入上也具有抗冲突性)。但是,为什么要对GUID进行哈希?

4如果哈希算法是完美的,并且哈希包含的位比GUID少4倍-这两个位可能会根据上下文而有所不同,对吗?加密哈希(例如MD5、SHA1)是16-20或更多字节。通过使用这种散列对GUID进行散列,他不会降低唯一性。事实上,散列后冲突的风险可能会增加,即使散列比GUID大。这取决于算法。根据定义,散列比原始散列“更少”唯一。[顺便说一句,GUID在统计上是唯一的]。一个4字节的散列很可能会产生冲突。而且,大多数答案都是随机的,没有什么帮助,因为没有人真正理解这个问题及其潜在的意图。澄清将使这个问题及其答案更加有用。