无冲突的整数数组哈希计算的最快方法

时间:2018-09-24 11:22:58

标签: java arrays integer hashcode

对于某些内容不同的Integer数组,Java方法Arrays.hashCode()或Objects.hash()返回相同的哈希值,例如

Integer[] a = {0,4,5,0}     // hash 927520
Integer[] b = {0,3,36,0}    // hash 927520

自定义哈希码方法返回相同的结果,例如:

public int hash(final Integer[] indexes) {
    final int prime = 31;
    int result = 1;
    for (Integer i : indexes) {
        result = prime * result + ((i == null) ? 0 : i.hashCode());
    }
    return result;
}

我同意这是预期的行为。但是,由于内容不同,我想为它们生成不同的哈希码。

没有冲突的整数数组

计算哈希的最快方法是什么

2 个答案:

答案 0 :(得分:2)

问题有点不同。首先想到为什么为什么,您需要hashCode以=开头才能进行快速查找。拥有两个可以生成相同哈希值的对象根本不是问题,因为这当然并不意味着它们是相同的(您仍将检查equals)。

在您的问题下您已经有一些评论,说这是不可能的,我只想添加一些您尚未想到的有趣的事情(可能是您根本不了解它们)。

通常,hash collisions在您可能想像的Java数据结构中更为频繁。根据{{​​3}}并考虑到hash实际上是32 bits,我们得出这样的事实:在存在50%之前,它仅需要 77,164 个唯一值long产生碰撞的机会(最好的情况是)。因此,碰撞不止是好事。话虽这么说,有Birthday problem可以改善这一点(据我了解,首先制作哈希-hash并加以改进;但并没有深入研究它)。

现在,您知道哈希冲突就更好了,请思考为什么要使用它们。基本上是为了快速查找。当有两个条目具有相同的HashMap时,这意味着它们将以相同的“存储桶”结尾,并且在Java中,该存储桶是一棵完全平衡的红黑树(对于HashSetO(1))-在查找条目时仍然非常快。因此,通常,任何基于散列的结构都具有恒定的搜索时间(即:摊销的<div class="sub-item content-spaced"> <span class="text">{{translations.taxEstLabel}}</span> {{#hasEstimatedTax}} <span class="value">{{totalEstimatedTax}}</span> {{/hasEstimatedTax}} {{^hasEstimatedTax}} <div aria-live="polite" class="tooltip" role="tooltip" tabindex="0" data-info-text="{{translations.taxEstMessage}}"><span style="display:none">{{translations.taxEstMessage}}</span></div> {{/hasEstimatedTax}} </div> ),因此不必担心散列冲突。

答案 1 :(得分:1)

没有办法满足您的要求。

您必须了解,哈希函数不能不能创建双向映射。这就是您在这里需要的!

含义:存在(接近)无限个具有任意int值的数组。如果每个散列都唯一地指向特定的数组设置,则可以通过其哈希来标识每个数组。但是int(或long)的范围不是不确定的。除了 count 个整数值以外,还有更多可能的数组组合!

您不能将不确定集合映射到非不确定集合上。

换句话说:如果存在这种哈希方法,则可以将其转换为压缩算法,该算法会将任何内容减少为单个int值。

因此:冲突是哈希算法的固有属性。你无法避免。如果有的话,您可以微调特定的哈希函数,以最大程度地减少特定输入数据集的冲突。但正如所说:从概念/数学的角度来看,您要的是不可能的。