即使每个值都是唯一的,使用64位TKey是否会发生密钥冲突?

时间:2013-07-26 01:48:44

标签: .net collections hash

似乎.NET中与哈希码相关的所有内容都是32位,但大多数集合类都允许您使用64位基元。这让我想知道,如果我有一台计算机能够运行这段代码来完成:

Dictionary<ulong, object> test = new Dictionary<ulong, object>();
for (ulong x = ulong.MinValue; x <= ulong.MaxValue; x++)
    test.Add(x, null);

会成功吗?或者它会在执行期间的某个时刻抛出“密钥已存在”异常吗?

1 个答案:

答案 0 :(得分:1)

  

会成功吗?

理论上是的,几乎没有(见下文)。

  

或者它会在执行期间的某个时刻抛出“key already exists”异常?

嗯,是的,它会抛出,但不是,因为你有一个关键的碰撞。它将因为你的内存不足而抛出。有2 ^ 64 ulong s,它们各占8个字节,因此所有ulong消耗

8 * 2 ^ 64 = 2 ^ 67 =(2 ^ 10)^ 6.7~ =(10 ^ 3)^(6.7)= 10 ^ 20字节〜= 100艾字节。

糟糕!

所以我说“理论上是”,因为你不会发生关键的碰撞;也就是说,仅仅因为密钥是64位ulong,但哈希码是32位并不意味着您将发生密钥冲突。您将发生哈希码冲突,但不是键冲突。

密钥为ulong。实施是Dictionary<ulong, object>使用Object.GetHashCode快速测试Dictionary<ulong, object>中的成员资格。给定ulong x,如果x.GetHashCode 等于字典中保存的某些ulong的哈希码,则可以非常快速地推导出x字典中的不是。另一方面,如果x.GetHashCode 等于字典中保存的某些ulong的哈希码,则可以非常快速地将x与所有ulong进行比较{1}}在字典中具有相同的哈希码,如果找到true则返回x,否则返回false