GetHashCode()得到的是一个32位的整数
难道要分配这么多个存储桶?
难道要分配这么多个存储桶?
解决方案 »
- 很菜的问题:BeginReceiveFrom 如何知道接收到了多少数据?
- 求教正则
- c#学习流程疑问?请各位大侠指教
- 新手提问,高手请进。调用COM函数的参数问题
- 一个数据库查询小问题
- IntPrt 数据类型转换---------------------------------
- winform 中 combobox 怎么实现对listview的类别查询??
- 请来帮忙把这段代码写成C#版的呢?
- 为什么Server.Execute会导致系统的form身份验证实效?
- 简单的问题
- C#菜鸟: if,else的用法
- 请问有没有Microsoft.Office.Interop.Excel.dll程序集的MSDN
当向 Hashtable 添加元素时,Hashtable 的实际加载因子将增加。当实际加载因子达到指定的加载因子时,Hashtable 中存储桶的数目自动增加到大于当前 Hashtable 存储桶数两倍的最小质数。
当向 Hashtable 添加元素时,Hashtable 的实际加载因子将增加。当实际加载因子达到指定的加载因子时,Hashtable 中存储桶的数目自动增加到大于当前 Hashtable 存储桶数两倍的最小质数。
那如果两个元素的HashCode不同,也可能存在同一个存储桶中?
怎么可能
>>这是你自己的理解能力有问题
你既然说如果两个元素的Hash代码不同,它们就存在于不同的存储桶,而每个元素的Hash代码是32位整数,也就是有2的32次方种可能,那要能唯一识别不能的元素,必然至少需要2的32次方个桶。这就像汉字超过了256个,要使得每个汉字的编码不同,一个字节就不够用,所以要用两个或更多。这是很简单的道理。根据我刚才对源码的初步分析,的确没那么多桶,但前提是Hash代码不同的元素,是可能存在于相同的桶的private uint InitHash(object key, int hashsize, out uint seed, out uint incr)
{
uint num = (uint) (this.GetHash(key) & 0x7fffffff);
seed = num;
incr = 1 + ((uint) (((seed >> 5) + 1) % (hashsize - 1)));
return num;
}
其中GetHash的实现为:
protected virtual int GetHash(object key)
{
if (this._keycomparer != null)
{
return this._keycomparer.GetHashCode(key);
}
return key.GetHashCode();
}也就是说:Hash代码并非是桶的代号,而只是用于计算桶的代号所以桶的数量我可以自定,比如我设为7,那么我可以把7,14,21放置于0号桶,把8,15,22放于1号桶,
所以如果有3个元素,它们的Hash代码分别是8,15,22的话,虽然各不相同,但是都被放于1号桶。
但是你居然认为既要让不同Hash代码的元素放于不同的桶,又要求桶的数目小于Hash可能的取值范围,你也把计算机看得太神秘了吧?