似乎.NET中与哈希码相关的所有内容都是32位,但大多数集合类都允许您使用64位基元。这让我想知道,如果我有一台计算机能够运行这段代码来完成:
Dictionary<ulong, object> test = new Dictionary<ulong, object>();
for (ulong x = ulong.MinValue; x <= ulong.MaxValue; x++)
test.Add(x, null);
会成功吗?或者它会在执行期间的某个时刻抛出“密钥已存在”异常吗?
答案 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
。