[英]Overriding GetHashCode() - how important is random distribution of hashes?
期待第一条评论,我确实了解一些哈希表理论,所以请继续阅读...
我有一个可变引用类型(内容可以更改),用作Dictionary
键。
是的,这是故意的(实际上是不可避免的)。 Dictionary
增长到数百万个条目,我希望通过键优化访问。
我的对象确实有一个保证唯一的、私有的、整数字段,它似乎是一个潜在的理想哈希代码,因为底层哈希表冲突是不可能的,但是这些(几乎)是连续的 1、2、4、5、6、9、10, 11、...
原则上:我应该这样做吗
public override int GetHashCode()
{
return myUniqueId;
}
或这个
public override int GetHashCode()
{
return GenerateRandomInt(seed:myUniqueId);
// where a 1:1 relationship exists between input seeds and output pseudo random numbers
// (still avoiding hash collisions but at the cost of the PRNG call)
}
从哈希表理论/最佳实践的角度来看,或者答案可能是特定于实现的(我必须测量 - 可能是每个部署环境)?
Eric Lippert 在这篇博客文章中提到随机分布作为“指南”: Lippert Fabulous Adventures in coding
作为哈希码的近序列整数将在Dictionary<TKey, TValue>
的哈希表的存储桶中很好地分配您的键。
字典使用以下公式来决定项目将进入哪个桶:
int targetBucket = hashCode % buckets.Length;
因此,您将通过近乎连续的 id 实现近乎完美的分布,从而在进行查找时将冲突分辨率降至最低。
只需使用您的uniqueId
值。 任务完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.