几个月前我需要深入研究哈希函数。这是我发现的一些东西。
您希望散列在整个目标空间(通常为 32 位,但可能是 16 或 64 位)中均匀随机分布命中。您希望输入的每个字符都对输出产生同样大的影响.
所有简单的散列(如 ELF 或 PJW)简单地循环遍历字符串并在每个字节中通过移位或 mod 进行异或运算,将不符合该标准,原因很简单:添加的最后一个字符具有最大的效果。
但在 Delphi 和 asm 中有一些非常好的算法。以下是一些参考资料:
请参阅 1997 年 Dobbs 博士在 burtleburtle.net/bob/hash/doobs.html 上发表的文章
代码在 burtleburtle.net/bob/c/lookup3.c
Paul Hsieh (AKA HsiehHash) 的 SuperFastHash 函数 c2004-2008
www.azillionmonkeys.com/qed/hash.html
您将在此参考中找到 Delphi(带有可选 asm)源代码:
http://landman-code.blogspot.com/2008/06/superfasthash-from-paul-hsieh.html
2008 年 7 月 13 日
“一年多以前,Juhani Suhonen 要求使用快速哈希值来为他的
哈希表。我建议使用旧的但性能很好的 elf-hash,但也注意到
我最近发现了一个更好的哈希函数。它被称为 SuperFastHash (SFH)
由 Paul Hsieh 创建,用于解决哈希函数的“问题”
从鲍勃詹金斯。 Juhani 询问是否有人可以在 basm 中编写 SFH 函数。
一些人研究了一个 basm 实现并发布了它。”
哈希传奇继续:
2007-03-13 Andrew:当散列不好就意味着缓存好
www.team5150.com/~andrew/blog/2007/03/hash_algorithm_attacks.html
2007-03-29 安德鲁:打破 SuperFastHash
floodyberry.wordpress.com/2007/03/29/break-superfasthash/
2008-03-03 Austin Appleby:MurmurHash 2.0
murmurhash.googlepages.com/
SuperFastHash - 985.335173 mb/秒
查找 3 - 988.080652 mb/秒
MurmurHash 2.0 - 2056.885653 mb/秒
提供 c++ 代码 MurmurrHash2.cpp 和对齐只读实现 -
MurmurHashAligned2.cpp
//================================================= =========================
// 这是兰德曼在 C# 中的 MurmurHash2
//2009-02-25 Davy Landman 用 C# 实现 SuperFashHash 和 MurmurHash2
//landman-code.blogspot.com/search?updated-min=2009-01-01T00%3A00%3A00%2B01%3A00&updated-max=2010-01-01T00%3A00%3A00%2B01%3A00&max-results=2
//
//Landman 在 C# 中实现 SuperFastHash 和 MurmurHash2 4 种方式:
//1:托管代码 2:内联位转换器 3:Int Hack 4:不安全指针
//SuperFastHash 1:281 2:780 3:1204 4:1308 MB/s
//MurmurHash2 1:486 2:759 3:1430 4:2196
对不起,如果上面的结果看起来很乱。我不得不剪切和粘贴它。
至少上面的参考资料之一为您提供了获取 64 位散列的选项,该散列在信用卡号空间中肯定不会发生冲突,并且可以轻松存储在 MySQL 的 bigint 字段中。
您不需要加密哈希。它们的 CPU 密集度更高。而“加密”的目的是阻止黑客攻击,而不是避免冲突。