我正在尝试创建一个函数,该函数根据我想要值的哈希表中的位置生成一个哈希键。
我的哈希函数是(a + b * (key) ) % c = hash value
。我在SO上看到了similar question,我尝试用b * (key)
取代d
,只是这样做:
private int ReverseModulus(int a, int b, int c, int hashValue)
{
if(hashValue >= c)
return -1;
if(a < hashValue)
return (hashValue - a) / b;
return (c + hashValue - a) / b;
}
但似乎大部分时间hashValue != Hash(ReverseModulus(a,b,c, hashValue))
。
我想知道这种方法是错误的还是代码中只有一个错误。
答案 0 :(得分:0)
你使用了错误的分裂。你正在进行整数除法,但你需要进行模块划分。在Java中,您可以使用BigInteger
:
bh = new BigInteger(hashValue);
ba = new BigInteger(a);
bc = new BigInteger(c);
bn = bh.subtract(ba);
return bn.modInverse(bc).intValue();
和C#可能具有相似的库函数。