平时都是使用 md5 做哈希,但是有时候感觉 32 位太长了,有点浪费,想问下大家除了 md5 ,还有没有其他优秀的哈希算法?比较短的

fnv

substr(md5(""), 8, 16);

ps md5 是 128 位的

%2

crc32 ?

越短越容易碰撞

额,是的,可能我用的单位表述不是很专业,我想说的就是看到它的是长度为 32 的字符串形式,明白就好

想问下截取中间的是什么依据,靠谱吗

嗯嗯,明白,短的话碰撞概率就高,但是有某些简单的场景,不需要那么高的抗碰撞率

crc32 ,我们是做 url 二级索引的,url 多了一级索引查的很郁闷,所以先 hash 一次然后二次查询

CRC32 FNV1a-32 CityHash32 等,一般一些简单用途我会选 FNV1a-32 ,因为它非常简单。

再补充一个 MurmurHash

看起来不需要防碰撞,那就 CRC
或者 en.wikipedia.org/wiki/List_of_hash_functions 里面挑一个

CRC3 CRC4 CRC8 CRC16 CRC32 CRC64

substr 解君忧

md5 默认是 hex 格式输出,你可以输出成 base64 ,这样去掉占位的 = 号,就只有 22 位字符了

續 15 樓
md5 編碼成 base94 ?

xxhash 家族

直接所有 ascill 相加成 16 进制😁

防碰撞哈希算法就没短的,感觉你要的是快速哈希算法,比如 Murmur 或者 CRC ,快且短,但是容易发生冲突。

把 MD5 断尾没问题,你可以自己做碰撞概率测试,每个 bit 概率是一样的。

非标准 base64 算法。把数字,小写字母,大写字母和一些特殊字符都用上,变成 N 进制,重新再编码这样就短了。一个 uuid 都可以编码到 22 个字符以下,只是字符看你能不能接受

哈希截断挺常见的,很多标准库都会有这种操作

md2 ,md4

可以试试 blake2/3 ?
www.blake2.net/

SipHash 不是专门设计来解决你这个问题的嘛?

CRC32 ,短到你用一个 int 就能存

security.stackexchange.com/a/72685

直接截前面一段就行,要多长截多长
但是 md5 本来就是比较差的算法,再截一下就更差了,如果需要防碰撞就换个 sha256 之类的吧

jhash 算法。 计算字符串的哈希,得到 4 字节哈希值。 github.com/ysmood/jhash

wyhash ,输出字符串长度 16 位,而且是目前最快且安全的算法

而且 wyhash is the default hashing algorithm of the great great Zig, V, Nim and Go (since 1.17) language

xxhash

cityhash murmurhash

xxhash 挺好的,非密码安全的哈希,速度也快。