我正在尝试为int16_t
. 函数原型如下所示:
uint64_t hash_int16_t(const void *key);
到目前为止,我已经得到了这个,但我不知道这是否是正确的方法:
uint64_t hash_int16_t(const void *key)
{
// key is expected to be an int16_t
const int16_t *e = (const int16_t*)key;
uint64_t x = (uint64_t)*e;
x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9);
x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb);
x = x ^ (x >> 31);
return x;
}
有符号类型有哈希函数吗?我应该使用 16 位无符号整数或 64 位无符号整数来混合这些位吗?如果整数为负数,当我将其转换为无符号类型时,我会丢失信息吗?这会产生未定义的行为吗?
PS 代码在 C 中,我从这里获取了哈希函数。
编辑 1:该参数是const void *key
因为允许用户将键存储为其他值,如结构或字符串。上述功能将添加对int16_t
键的支持。
编辑2:我想要完成的是一个通用哈希表。初始化哈希表时,用户必须提供一个哈希函数,上面的示例与哈希表捆绑在一起。