数组大小为600且具有最少冲突的哈希码

时间:2017-03-22 07:01:18

标签: java arrays hashcode

所以我正在使用一个包含400个数据值的文件,所有整数和4到20,000的值。我将所有这些加载到一个大小为400的数组中。还有另一个大小为600的ListNode空数组,我将数据移动到,但是使用自编写的哈希代码(我将在下面发布)。

因为长度为600的数组中的每个索引都有一个ListNode,如果有任何冲突,则数据值将添加到ListNode的后面。我还有一个方法返回数组的百分比。但基本上因为我将400个数据值加载到600大小的数组中,所以我可以拥有的空值百分比最小为33.3%,因为如果没有冲突,则数组中有400个空位,200个为空,但是这个事实并非如此:

return (num+123456789/(num*9365))%600; //num is the value read from the array of 400

hashCode给了我48.3%null的最佳结果,我至少需要它低于47%。提出这个hashCode的任何建议或解决方案?我非常感谢任何帮助。如果您需要更多信息或详细信息,请告诉我们。谢谢!!!

2 个答案:

答案 0 :(得分:1)

我做了一些随机数的实验:在[0,599]范围内生成400个均匀分布的随机数,并检查该范围内没有生成多少个值。事实证明,平均51.3%的值未生成。所以你的48.3%已经好于预期。 除非使用某种形式的完美哈希,否则47%的目标似乎是不现实的。

如果你想自己做一些实验,这是程序。

public static void main(String[] args) {
    Random r = new Random();
    int[] counts = new int[600];
    for (int i = 0; i < 400; i++) {
        counts[r.nextInt(600)]++;
    }
    int n = 0;
    for (int i = 0; i < 600; i++) {
        if (counts[i] == 0) {
            n++;
        }
    }
    System.out.println(100.0 * n / 600);
}

答案 1 :(得分:0)

我使用散列算法的JAVA实现:

Hava a look at open-jdk HashMap

static int hash(int h) {
     // This function ensures that hashCodes that differ only by
     // constant multiples at each bit position have a bounded
     // number of collisions (approximately 8 at default load factor).
     h ^= (h >>> 20) ^ (h >>> 12);
     return h ^ (h >>> 7) ^ (h >>> 4);
 }

请注意,您也添加了一个模运算,以确保该值不会大于600

编辑1

>>> is logical shift right

实施例

10000000 >>> 2 = 00100000