三个有符号整数的哈希函数
Hashing Function for Three Signed Integers
我正在尝试使用一个带有三个有符号整数的unsodered_map作为密钥(这是因为我希望使用tbb的concurrent_unordered_map)。
我把这个小(3x16位=>64位)函数放在一起:
// to hash
int64_t result = int16_t(x);
result = int64_t(result << 16) + int16_t(y);
result = int64_t(result << 16) + int16_t(z);
// from hash
int16_t x_ = int16_t(result >> 32);
int16_t y_ = int16_t(result >> 16);
int16_t z_ = int16_t(result & 0xFFFF);
这不起作用,我在这里犯了什么错误?
我的数字分布是这样的,接近零的负数或正数更有可能(通常小于+/-2^8),但我想将其扩展到2^32的范围,而不是这里的2^16示例。理想情况下,我正在寻找在典型范围内很少的碰撞,最好是一个简单的算法。有什么建议吗?
您的问题是执行位操作并添加有符号的数字。如果数字是负数,加法运算将转化为减法运算。在这种情况发生后,很难找出正确的原始值。
考虑:
int16_t x = -1, y = 2, z = -3;
int64_t result = x; // result: FFFFFFFFFFFFFFFF
result = (result << 16) + y; // result: FFFFFFFFFFFF0000 + 0002
result = (result << 16) + z; // result: FFFFFFFF00020000 - 0003
return result; // result: FFFFFFFF0001FFFD
因此,在保留了-1
和-3
的同时,减法的结果已经将2
减少为1
。
相反,您应该限制对无符号值的操作。对于无符号值,+
和|
在代码中是等效的,因为您要将其添加到要填充0
的数字部分中。
int64_t hash () {
uint64_t result = uint16_t(x_);
result = (result << 16) + uint16_t(y_);
result = (result << 16) + uint16_t(z_);
return result;
}
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如果索引不是整数,我们如何在 C++ 中插入哈希表
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 对 32 位整数进行哈希处理比对 3 个 16 位整数的哈希进行按位运算慢?
- 如何将单个字符转换为为基本密码哈希器设置整数,C++
- 如何从 3 个有序整数创建哈希
- 一对整数的哈希算法
- 从 2+ 个整数(快速)创建哈希/种子值
- 有效地将 16 位整数哈希为 256 位空间
- 好的哈希函数,2个整数用于一个特殊的密钥
- 这是什么C++语言结构:#(即哈希)整数"path_to_header_or_cpp_file"<integer>?
- 迁移一个哈希函数,其中包含从 C++/Qt 到 Java 的 32 位无符号整数
- 哈希映射(整数,字符串[])在C++
- 三个有符号整数的哈希函数
- 可以返回基于字符串的整数范围的哈希函数
- 如何散列字符串?我需要把随机字符串转换成整数,放到哈希表中
- 哈希函数用于6个整数的良好排序/比较
- c++将十六进制md5哈希值转换为十进制整数
- 对一对整数(pair
)向量的哈希函数