繁体   English   中英

覆盖 GetHashCode() - 散列的随机分布有多重要?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM