我创建一个 GUID(作为字符串)并获取它的哈希值。我可以认为这个哈希是唯一的吗?
7 回答
不像 GUID 本身那样可靠独特,不。
只是为了扩展,您将您的唯一性减少了 4 倍,从 16 个字节到 4 个字节的可能组合。
正如评论中指出的那样,哈希大小会有所不同。4 字节的东西是一个假设,我知道充其量是可怕的,它可以在 .NET 中使用,其中默认哈希大小为 4 字节(int)。所以你可以用你的散列可能是什么字节大小来替换我上面所说的。
没有。
如果您想要一个迷你 GUID,请参见此处:https ://devblogs.microsoft.com/oldnewthing/20080627-00/?p=21823
一句话,没有。
假设您的哈希比 GUID 的位数少,根据鸽子洞原理,必须存在多个 GUID -> 哈希的映射,因为哈希比 GUID 少。
如果我们假设散列具有比 GUID 更多的位数,那么在您使用良好的散列函数的情况下,发生冲突的可能性非常小(但有限)。
将任意大小的数据块减少到固定大小的位数的散列函数不会在两者之间产生一对一的映射。总是存在将两个不同的数据块减少为哈希中相同的位序列的机会。
好的散列算法将这种情况发生的可能性降到最低,通常,散列中的位越多,发生冲突的可能性就越小。
由于散列冲突,它不能保证。GUID 本身几乎可以保证。
出于实际原因,您可能可以假设散列是唯一的,但为什么不使用 GUID 本身呢?
不,我不会假设任何哈希值的唯一性。这无关紧要,因为哈希值不需要唯一,它们只需要均匀分布在它们的范围内。分布越均匀,发生的冲突就越少(在哈希表中)。更少的冲突意味着更好的哈希表性能。
fyi 有关哈希表如何工作的良好描述,请阅读什么是哈希表和哈希映射及其典型用例?
如果您使用加密散列(MD5、SHA1、RIPEMD160),散列将是唯一的(模冲突,这是非常不可能的——SHA1 用于例如数字签名,MD5 在随机输入上也是抗冲突的)。不过,为什么要散列 GUID?