什么是Rabin-Carp算法的最佳哈希函数
What is the best hash function for Rabin-Karp algorithm?
我正在为Rabin-Carp算法寻找一个高效的哈希函数。这是我的实际代码(C编程语言)。
static bool f2(char const *const s1, size_t const n1,
char const *const s2, size_t const n2)
{
uintmax_t hsub = hash(s2, n2);
uintmax_t hs = hash(s1, n1);
size_t nmax = n2 - n1;
for (size_t i = 0; i < nmax; ++i) {
if (hs == hsub) {
if (strncmp(&s1[i], s2, i + n2 - 1) == 0)
return true;
}
hs = hash(&s1[i + 1], i + n2);
}
return false;
}
我考虑了一些Rabin-CarpC实现,但所有代码之间都存在差异。所以我的问题是:Rabin-Carp散列函数应该具有什么特性?
一个性能非常好的哈希是bernstein哈希。它甚至跑得更远许多流行的哈希算法。
unsigned bernstein_hash ( void *key, int len )
{
unsigned char *p = key;
unsigned h = 0;
int i;
for ( i = 0; i < len; i++ )
h = 33 * h + p[i];
return h;
}
当然,您可以尝试其他哈希算法,如下所述:NIST 上的哈希函数
注:从未解释过33
为什么表现得这么好比任何其他"更有逻辑"的常数。
为了您的兴趣:以下是不同哈希算法的良好比较:散列算法的strchr比较
Rabin-Carp散列函数应该具有哪些特性?
拉宾·卡普需要一个滚动散列。最简单的滚动散列是移动和。Adler-32和Buzhash也很简单,表现比移动总和更好。
这些滚动散列技术中的任何一种都应该适用于Rabin Karp:
- 移动总和
- 用减法删除最旧的字节
- 通过加法添加新字节
- 多项式滚动散列
- 用减法删除最旧的字节
- 用乘法和加法加一个新字节
- 拉宾指纹
- 一个多项式在GF(2)上不可约的多项式滚动散列
- 制表哈希
- 使用表查找和
xor
删除最旧的字节 - 使用表查找和
xor
添加新字节
- 使用表查找和
- 循环多项式,又名Buzhash
- 基于循环移位的制表散列
- Adler-32校验和
- 默认情况下不是滚动校验和,但很容易调整为"0";滚动"
- 用两个减法删除最旧的字节
- 添加两个新字节
对于小字母的问题,例如核酸序列搜索(例如alphabet = {A, T, C, G, U}
),nt哈希可能是一个很好的哈希函数。它使用了速度更快的二进制操作和滚动哈希更新,还提供了统一的分布式哈希值。
考虑到Java JDK的实现者会有一些想法,我查找了那里使用的函数。
从Java 19开始,https://github.com/openjdk/jdk/blob/jdk-19+23/src/java.base/share/classes/java/lang/String.java#L2326
更新功能为:
h' = 31 * h + c
初始值为0。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 使用Qt C++计算类似Git的SHA1哈希
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- c++找不到具有相同哈希的无序集合元素
- 哈希文件递归并保存到矢量Cryptopp中
- 对 pair<pair<int,int>pair<int,int unordered_map进行哈希处理>>
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- 给定哈希函数解码消息的最佳方法是什么
- 在C++中实现哈希旋转方法的最佳方式是什么
- 什么是Rabin-Carp算法的最佳哈希函数
- 适用于短文件名的最佳字符串哈希函数
- 此示例的最佳字符串哈希函数
- 比较sha1哈希是否相等的最佳方式
- 从两个浮点向量生成哈希的最佳方法
- 存储具有字符串类型键的哈希值的最佳结构
- 对不太长的字符串向量 (urls) 进行哈希处理的最佳方法是什么?