algorithm - Go:用于字符串比较的多项式指纹
问题描述
我想实现一个滚动哈希函数来进行字符串比较(Rabin-Karp)
为此,我将输入字符串转换为字节切片(使用 go unicode/utf8)并在其上运行“多项式指纹”功能。
例如,我输入qwerty
转换为[113 119 101 114 116 121]
我使用基数的字符串256
rune 121, base 256.0, exponent 0, value 121
rune 116, base 256.0, exponent 1, value 29696
rune 114, base 256.0, exponent 2, value 7471104
rune 101, base 256.0, exponent 3, value 1694498816
rune 119, base 256.0, exponent 4, value 511101108224
rune 113, base 256.0, exponent 5, value 124244813938688
我对“多项式指纹”的概念有疑问:很快,基础变得非常大,如何随着用户想要匹配的字符串输入进行扩展?
在我的用例中,因为 Gomath.Pow
函数使用 float64 类型,所以在 7 个字符后它会变得混乱
rune 114, base 256.0, exponent 7, value 8214565720323784704
rune 101, base 256.0, exponent 8, value -9223372036854775808
rune 119, base 256.0, exponent 9, value -9223372036854775808
rune 113, base 256.0, exponent 10, value -9223372036854775808
我觉得使用 uint64 只会使问题向前一点
解决方案
哈希函数的思想其实就是会溢出,但是大概率不同的字符串会给出不同的哈希值。为了使其工作,您需要使用互质数作为运算的基数和模数。您应该使用一些素数基数(大于字母大小)并执行所有操作模数一些素数(尽可能大)(素数将导致最小的碰撞机会)。对此哈希使用整数类型。如果您需要您的字母表至少有 256 个符号,您可以使用 uint64,base 257 并执行所有操作,例如,模数 10 12 +39
推荐阅读
- ruby - 如何从 Terraform 中的外部数据源访问 JSON?
- macos - 我成功地使用 curl 代码将文本下载到 Visual Studio 代码中。有没有办法重定向它并将其保存为文本文件?
- c - 如何运行此文本文件并使用 strtok() 提取数字并将数字存储在不同的文件中?
- c++ - 获取函数不适用于虚方法
- angular - 如何使用角度材料放置内联 div?
- javascript - 使用 requestAnimationFrame 重复的 3 秒动画
- python - Tensorflow 错误:不支持的可调用 - (来自 ex ???)
- javascript - 动态生成 TinyMCE 下拉菜单
- java - 如何从 Spring Boot 测试中启用嵌入式 MongoDB 中的日志
- spring - 将 Spring 数据源传递给 Javers 以审核 DTO