如何反向工程哈希函数

时间:2017-02-21 20:57:02

标签: java c# math hash

我正在尝试创建一个函数,该函数根据我想要值的哈希表中的位置生成一个哈希键。

我的哈希函数是(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))

我想知道这种方法是错误的还是代码中只有一个错误。

1 个答案:

答案 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#可能具有相似的库函数。