每当我尝试生成索引值时,我会在一个索引处遇到许多冲突。一个指数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;
}
答案 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压缩函数方法完美配合。 谢谢大家!