多项式哈希函数 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 方法完美配合。
谢谢大家!
每当我尝试生成一个索引值时,我都会在一个索引处遇到很多冲突。一个索引 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 方法完美配合。 谢谢大家!