C ++ hashCode - 使用大数字(+ mod操作)

时间:2018-05-04 19:19:37

标签: c++ hashcode mod

我正在开发一个涉及编程Java hashCode()哈希函数的项目,
the formula

随机生成输入字符串(即“A添加触发单元C”)并将其存储在.txt文件中。此外,如果结果散列不在范围内(0< hash< N),则需要调整=>哈希%N)。

我遇到了hashCode()算法的问题,因为字符串中只有一个char的结果太大(即1.408 * 10 ^ 30)存储在常规变量中。 我已经尝试使用一些允许你存储非常大的数字的库,但如果哈希超过N参数,它们都不允许你进行mod操作。

请问,你会为我推荐什么解决方案,这样我就可以存储这些非常长的数字+使用mod操作。

由于

1 个答案:

答案 0 :(得分:2)

你不能存储C ++中的大数字,但只要N不是一个巨大的数字,它肯定是可能的。诀窍是在循环字符串时执行what wond erfu lday iflifewa seasythe ngodwoul dnothave givenusb raintoth ink ,这样你的号码永远不会溢出。

您可以使用此方法 - https://math.stackexchange.com/a/453108来查找 (A ^ B)%N,即(31 ^ 200)%N。

% N

然后,按照公式不应该溢出数字。

//This is the algorithm mentioned in the above link
const size_t N = 1e9 + 7;
size_t bigPower(size_t x, size_t p) {
    size_t ans = 1;

    while(p > 0){
        if(p % 2 == 1)
            ans = (ans*x)%N;
        x = (x*x)%N;
        p /= 2;
    }

return ans;
}

<强>更新 我发现Java hashCode实际上可以溢出并返回负哈希码 - HashCode giving negative values。因此,如果您希望hashCode的行为与Java类似,那么您可以允许溢出。

size_t hashCode(const string& s) {
    size_t result = 0;
    for(size_t i = 0; i< s.size(); i++) {
        result += (s[i] * bigPower(31, s.size()-1-i))%N;
        result %= N;
    }

    return result;
}