我正在研究一个哈希函数,它将一个字符串作为输入。
现在,我正在做一个循环,在hash (一个int变量)中乘以一个值,然后将当前字符的ASCII代码添加到混合中。
hash = hash * seed + string[i]但有时,如果字符串足够大,有一个整数溢出,我可以做什么来避免它,同时保持相同的哈希结构?也许在循环中包含一点操作?
发布于 2010-05-05 03:17:21
如果您可以访问更大的数据类型,则可以执行以下操作:
int32_t hash, seed;
int64_t temporary;
temporary = hash * seed + string[i];
hash = ( temporary >> 32 ) ^ ( temporary & 0xFFFFFFFF );否则,您将不得不手动将散列和种子相乘为两个值,使用overflow添加stringi,然后将这两个值相加^。
哈希是隐式有损的,因此,除非有特定的原因需要它们,如匹配现有算法,否则就让溢出的比特消失,这应该是可以的。
https://stackoverflow.com/questions/2768183
复制相似问题