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