1

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

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

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

4

1 回答 1

1

会成功吗?

理论上是,实际上不是(见下文)。

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

嗯,是的,它会抛出,但不是因为你有一个键碰撞。它会抛出,因为你的内存不足。有 2^64 个ulongs,每个占用 8 个字节,所以所有的ulongs 都消耗

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>. 给定 a ulong x,如果x.GetHashCode不等于字典中保存的一些哈希码,它可以很快推断出它不在字典。另一方面,如果等于字典中保存的某个哈希码,它可以非常快速地与字典中具有相同哈希码的所有s进行比较,如果找到则返回,否则返回。ulongxx.GetHashCode ulongxulongtruexfalse

于 2013-07-26T02:00:51.510 回答