加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 哈希码非零初始值 – 注意:我不是在询问素数

发布时间:2020-12-15 05:36:53 所属栏目:百科 来源:网络整理
导读:这是一个学术观点,但我觉得如果我不理解为什么这会被诸如Effective Java和许多SO问题这样的书推荐,我不完全理解哈希码. 假设: public sealed class Point{ private readonly int x; private readonly int y; //constructor ommited //equals ommited public
这是一个学术观点,但我觉得如果我不理解为什么这会被诸如Effective Java和许多SO问题这样的书推荐,我不完全理解哈希码.

假设:

public sealed class Point
{
    private readonly int x;
    private readonly int y;

    //constructor ommited

    //equals ommited

    public override int GetHashcode()
    {
       int hash = 17; //why should the initial value be non-zero?
       unchecked
       {
         hash = hash * 31 + x; //do not tell me why I should use primes - that is not the question
         hash = hash * 31 + y;
         return hash;
       }
    }
}

现在,据推测,初始值的原因是它减少了其中一个组件为零的冲突.

我很想找到任何有帮助的例子.

这是一个碰撞的例子,但是初始值没有任何可能性.

x   y   Hash Without initial value     Hash With initial value  
0   31  31                             16368                
1   0   31                             16368

理想情况下,我正在寻找一个具体的例子,其中初始值可以防止碰撞.

我的理论为什么初始值永远不会有所作为

//Given a prime p,initial value i,fields a,b,c,calculate hash h
h = i;
h = h*p + a;
h = h*p + b;
h = h*p + c;

因此:

h = ((i*p + a)*p + b)*p + c
  = (ipp + ap + b   )*p + c
  = ippp + app + bp + c

因此,初始值i将通过产生常数值以相同的方式影响所有哈希码,在这种情况下为i * p3.

解决方法

初始值必须是素数.为什么?因为你要哈希来获取长度为20的数组的索引:[object.getHash()]是你想要存储对象的数组的索引. 如果您使用了偶数:数据结构的一半地址将永远不会被使用…这就是您需要使用初始值的原因:最小化冲突…并最大化数据结构使用

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读