字符串哈希为 Long 型整数算法有推荐的吗

2020-06-30 18:35:45 +08:00
 yanshenxian

用来标记一个字符串, 可以忍受一定的碰撞概率

3281 次点击
所在节点    程序员
33 条回复
ThirdFlame
2020-06-30 18:38:31 +08:00
哈希值 截取部分 转回 long ?
ipwx
2020-06-30 18:43:41 +08:00
ret: unsigned long long = 0
for c in s:
ret = ret * 131 + (uint8)c;
ipwx
2020-06-30 18:44:37 +08:00
这是当年我刷算法题,对付 char 字符串的手写哈希算法常用的方式。虽然不一定是最好的,但是胜在写起来快。如果是 unicode 你可以网上找找,131 替换成什么。(提示:一定要是素数)
yanshenxian
2020-06-30 18:45:09 +08:00
@ThirdFlame 这个想法不错.. 截 15 位 这个概率应该挺低的
ipwx
2020-06-30 18:46:41 +08:00
@yanshenxian 这个想法一点都不好。。。。 前 15 位相同的字符串算出来的哈希值一模一样。。。。
yanshenxian
2020-06-30 18:46:41 +08:00
@ipwx 这个碰撞概率怎么看? 是不是只要不溢出就不会碰撞 😂
yanshenxian
2020-06-30 18:47:52 +08:00
@ipwx 这个应该可以先用 md5 哈希下, 然后截取 8-23 位的转成 long
ipwx
2020-06-30 18:47:59 +08:00
@yanshenxian 溢出也没关系的。。。你乘以 256 溢出就消失了,但是乘以一个素数(比如 131 这个数字是传统,从 NOI 银牌选手那里继承来的习惯)信息是不会完全消失的。
ipwx
2020-06-30 18:48:13 +08:00
@yanshenxian MD5 当然可以,但是更慢。
qwerthhusn
2020-06-30 18:53:13 +08:00
MURMUR3
yanshenxian
2020-06-30 18:59:54 +08:00
@qwerthhusn 这个如果生成 64 位以及以上的话,很容易得到一个负值. 不太好用作数据库主键
zjyl1994
2020-06-30 19:03:55 +08:00
fnv1a ?这个是一个很成熟的字符串哈希算法,我记得输出是 32bit 的整数,好像也有 64bit 的变体
CEBBCAT
2020-06-30 19:06:20 +08:00
问题发出 24 分钟后,楼主在第 11 个回复中指出是想用作数据库主键
---
根据 XY 问题,反正我个人建议楼主开门见山地托出自己遇到的业务问题
chendy
2020-06-30 19:15:52 +08:00
原来楼主是要做数据库主键?
和内容相关的主键不合适吧
p2pCoder
2020-06-30 19:15:58 +08:00
64 位 一般都很难碰撞
机器学习 深度学习里面用的最多是 mumurhash3
存过线性模型,32 位,三千万的模型碰撞位七八万
64 位,75 亿的模型,碰撞为 0
yanshenxian
2020-06-30 19:21:26 +08:00
@CEBBCAT append 了
yanshenxian
2020-06-30 19:23:21 +08:00
@chendy 主要是想用 insert ignore 直接插入,不想先需要判断是否存在,再得到主键
yanshenxian
2020-06-30 19:24:11 +08:00
@p2pCoder 嗯 64 位确实好。。
msg7086
2020-06-30 19:35:08 +08:00
主键与业务无关。整个问题的大前提就错了……
exch4nge
2020-06-30 19:38:38 +08:00
BLAKE2 算法,支持生成长度 1 ~ 64 字节的结果

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/686002

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX