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