针对特定场景的快速哈希函数
Fast hash function for specific scenario
>我正在寻找一个快速哈希函数,用于哈希表查找。输入由递归形式 f(x, y) 的表达式组成,其中 x 和 y 可以是具有两个参数的函数,也可以是变量。举几个例子:
- b(b
- (b,b),b),b)
- 福(酒吧,酒吧) a(
- a,a),a(a,a),a))
可以包含 200.000 个字符,我需要将数千个表达式散列到同一个表中。我发现了一些有效的东西:
int hash(string s, int n) {
unsigned int v = 37;
for(string::iterator it = s.begin(); it != s.end(); it++)
v = (v * A) ^ (*it * B);
return (v * n) % C;
}
其中,输入仅包含表达式的前 10 个字符和整个表达式的长度。A、B 和 C 分别为 541、733 和 941。对于几种最坏的情况(像第一个示例这样的长、重复、嵌套循环),该算法在 100 毫秒内运行,但我遇到了很多冲突,我想知道即使在这些情况下我是否可以更接近 O(1) 查找。
试试这个:
uint32_t hash(const string &s, uint32_t n) {
uint32_t step = 1 | (s.size() >> 4); // ~16 iters
uint32_t h = 0x1F351F35; // Barker code - 2
for(uint32_t i = 0; i < s.size(); i += step + (h & step))
h = ((h << 5) | (h >> (32 - 5))) + (s[i] ^ n ^ i);
return h % C;
}
相关文章:
- 如何为位集找到/实现一个好的哈希函数
- 对于短字符串来说,这是一个很好的哈希函数吗?
- 我在C++中使用提升哈希函数将 3 个双精度组合成一个面临冲突的哈希
- 无冲突的哈希函数
- Qt5 哈希函数在 Windows 7 和 Windows10 上不会返回相同的哈希
- 解决由于在哈希函数中使用了不完整的类型而导致的编译失败
- 使用 Murmur2 64 位哈希函数生成会导致冲突的输入
- 错误:哈希函数必须可使用键类型的参数进行调用
- unordered_set是否适合存储矢量<int>元素的数据结构?如果是这样,我将如何实现哈希函数?
- 为什么C++哈希函数的返回类型是 std::size_t,而不是独立于平台的类型?
- 哈希函数计算
- 哈希函数中同一键的不同值和良好的哈希值排序
- 将 C# 哈希函数转换为C++
- 如何创建用于生成噪声的哈希函数
- 插入不从哈希函数中检索键
- 简单的 C++11 哈希函数无法编译
- 对于这个英语单词列表来说,什么是好的哈希函数?
- std::bitset 哈希函数算法
- 如何生成伪随机 32 字节字符串以用作加密哈希函数中的盐?
- C unordered_map自定义的哈希函数碰撞