多项式哈希函数 java?

polynomial hash function java?

每当我尝试生成一个索引值时,我都会在一个索引处遇到很多冲突。一个索引 300 的最高碰撞和第二高的碰撞是 10。我认为问题是如果单词的长度为 1, 2, 3 。它们通常产生较小的幂,因此产生较小的数字。导致它被添加到数量较少的桶中。是否存在不会发生这种情况的 poly 函数?或者你能帮我解决这个问题吗?

public int GetHashCompress(String str ){
    int ply=0;
    double mathIt=0;
    int size = str.length();
    for(int j = 0 ; j< size ; j++){
        double x0 =  (double) str.charAt(j); 
        double firstStep = (int) Math.pow(31, (size-j))*x0;
        mathIt = mathIt + firstStep  ;      // hash function +1 to increance  the range to keep 33 to the power >1 

        }
    //arrayOfRawHash.add(mathIt); // this is for testing it later
    ply =(int) mathIt %numBucket;// this is where it is compressed 
    return ply; 

}

Jenkin's One-at-a-Time Hash 为小值提供了良好的雪崩行为并且非常容易编码。

public static int oatHash(final String hashMe) {
    return oatHash(hashMe.getBytes());
}

public static int oatHash(byte[] hashMe) {
    int hash = 0;
    for (byte aHashMe : hashMe) {
        hash += aHashMe;
        hash += (hash << 10);
        hash ^= (hash >> 6);
    }
    hash += (hash << 3);
    hash ^= (hash >> 11);
    hash += (hash << 15);
    return hash;
}

您的哈希函数发生冲突,因为它太可怕了。 31^i for i = 0 to size,基本上每一步都会有 i 基数 31 的根。31、31*31、31*31*31,这些不是不同的素数来阻止碰撞或好的雪崩级联,这将花费大量时间来执行电源程序。这些都是同一个数的倍数。

 private static long hash(long v) {
        long hash = v;
        long h = hash;

        switch ((int) hash & 3) {
            case 3:
                hash += h;
                hash ^= hash << 32;
                hash ^= h << 36;
                hash += hash >> 22;
                break;
            case 2:
                hash += h;
                hash ^= hash << 22;
                hash += hash >> 34;
                break;
            case 1:
                hash += h;
                hash ^= hash << 20;
                hash += hash >> 2;
        }
        hash ^= hash << 6;
        hash += hash >> 10;
        hash ^= hash << 8;
        hash += hash >> 34;
        hash ^= hash << 50;
        hash += hash >> 12;
        return hash;
    }

问题出在我的压缩函数上。它与压缩函数的 MAD 方法完美配合。 谢谢大家!