C++ 克努特';基于位移位的s乘法散列函数

C++ 克努特';基于位移位的s乘法散列函数,c++,algorithm,hash,C++,Algorithm,Hash,我试图通过A=2654435769的位移位来实现Knuth的乘法算法 和2^p元素的哈希大小 但非移位算法和移位算法给出了不同的结果 下面是我如何实现这两个alg的: template int mult_hash_simple(int key) { double A = 0.61803398863412439823150634765625; double exp = A*key; return max_key*(exp - (int

我试图通过A=2654435769的位移位来实现Knuth的乘法算法 和2^p元素的哈希大小 但非移位算法和移位算法给出了不同的结果

下面是我如何实现这两个alg的:

template int mult_hash_simple(int key) { double A = 0.61803398863412439823150634765625; double exp = A*key; return max_key*(exp - (int) exp); } template int mult_hash_advanced(int key) { // const int w = 32; const unsigned long long A = 2654435769; unsigned long long r0 = key*A; return r0 & ( (1 模板 int mult\u hash\u simple(int key) { 双A=0.6180339863412439823150634765625; 双exp=一个*键; 返回最大密钥*(exp-(int)exp); } 模板 int mult_hash_advanced(int key) { //常数int w=32; 常量无符号长A=2654435769; 无符号长r0=键*A; 返回r0&(1)
UPD:更新了一些变量类型。问题仍然存在。

下面的函数具有与mult\u hash\u simple函数相同的高级哈希逻辑

template<int max_key_power, int p>
int mult_hash_advanced(int key)
{
//  const int w = 32;
    const long long w_bit = 4294967295; // Integer representation of binary value that has last 32 ( which is w value )  bits as 1
    const int A = 2654435769; 
    long long r0 = key*A;


    return (( r0 & w_bit ) >> ( 32 - p ) ) ;
}
模板
int mult_hash_advanced(int key)
{
//常数int w=32;
const long long w_bit=4294967295;//最后32位(即w值)为1的二进制值的整数表示形式
常数int A=2654435769;
长r0=键*A;
返回((r0&w_位)>>(32-p));
}

对于
A
也可以使用
long
来尝试。使用输出的示例调用?