多项式哈希函数java?

时间:2015-11-02 01:35:36

标签: java hash hashcode

每当我尝试生成索引值时,我会在一个索引处遇到许多冲突。一个指数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; 

}

3 个答案:

答案 0 :(得分:0)

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;
}

答案 1 :(得分:0)

您的哈希函数发生冲突,因为它太可怕了。 31 ^ i对于i = 0到大小,基本上每一步都将具有基数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;
    }

答案 2 :(得分:0)

问题是我的压缩功能。它与MAD压缩函数方法完美配合。 谢谢大家!