我正在开发一个涉及编程Java hashCode()哈希函数的项目,
the formula
随机生成输入字符串(即“A添加触发单元C”)并将其存储在.txt文件中。此外,如果结果散列不在范围内(0< hash< N),则需要调整=>哈希%N)。
我遇到了hashCode()算法的问题,因为字符串中只有一个char的结果太大(即1.408 * 10 ^ 30)存储在常规变量中。 我已经尝试使用一些允许你存储非常大的数字的库,但如果哈希超过N参数,它们都不允许你进行mod操作。
请问,你会为我推荐什么解决方案,这样我就可以存储这些非常长的数字+使用mod操作。
由于
答案 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;
}