1. 引言
哈希函数有多种,可分为:
- 1)面向数据的哈希算法
- 数据独立哈希算法
- 数据依赖哈希算法
- 2)面向安全的哈希算法
- 密码学安全哈希算法:意味着无法从数学上根据哈希结果,获得原始数据。且无法预测哈希结果中任意bit的改变。
- 密码学不安全哈希算法
哈希算法也用于hash tables,仅需要确保避免哈希碰撞即可。为此,需要一种快速的面向数据的哈希算法,当前流最流行的面向数据的哈希算法有:
- xxHash64
- City64
- Mumur
William Stafford Parsons 于最近提出ChargeHash哈希算法,为:
- 一种新的32位最小哈希算法,具备双线程单字节处理。
- 对32位系统和64位系统都可移植
- 不使用模、乘法或除法算术运算:关键点在于这,使得可一次性处理。
- 输入字节按字节处理,并在2个具有64位状态的CPU线程之间分割:可运行为2个主线程,使得其在具有2个CPU的系统上运行会更快。
- 满足所有设备的合规性、可移植性和安全性要求
- 被设计为CRC32、FNV1a、Jenkin的更高指令、更快速替代方案。
- 速度比CRC32快1.5倍
- 是FNV1a速度的0.8倍
- 与Jenkin速度相当
- 每个32位摘要均受64位安全性保护,可在不产生太多开销的情况下,缓解preimage攻击:将其状态以64 bit state value表示,可运行在32位或64位系统(x86和x64)。
- 通过了所有SMHasher和extended SMHasher的“excessive torture”测试,可能是通过所有测试的最小哈希算法。当使用32位种子初始化状态或辅助变量时,大多数测试都会通过。
开源代码实现见:
程序:
uint32_t chargehash(const unsigned long input_count, const unsigned char *input) {
uint32_t state = 0;
uint32_t auxiliary = 0;
unsigned long i = 0;
while (i != input_count) {
state += (state << 11) | (input[i] + 1111);
state ^= state >> 5;
auxiliary += ((auxiliary << 8) | input[i]) + 1;
i++;
}
state += (((state << 9) | (state >> 23)) + state) << (17 - (state & 3));
auxiliary += (auxiliary << 11) | 1111;
state += auxiliary >> 6;
state ^= state >> 5;
state ^= (((state << 21) | (state >> 11)) - state) >> (13 - (state & 7));
state += state << 15;
state += (state >> 7) + (auxiliary >> 2) + auxiliary;
return state;
}
输出结果:
=== ChargeHash ===
Message: The quick brown fox jumps over the lazy dog
Output: 6ea6c870
由此可知,输出为4字节,32bit。
2. 其它非密码学哈希算法
其它非密码学哈希算法有:
- Perfect hash:为优化hash value的非密码学哈希
- Universal hash:与universal hash概念相关
- FNV:为最快的哈希算法之一
- Murmur:为最快的哈希算法之一
- Siphash:为一种快速哈希算法
- Spooky:为一种快速哈希算法
- xxHash:为最快的哈希算法之一
- Meow:为最快的哈希算法之一
- o1Hash:为最快的哈希算法之一
- CRC-32:为最快的哈希算法之一
- wyhash:为最快的哈希算法之一
- CityHash:为最快的哈希算法之一,且无安全性问题
- FarmHash:为最快的哈希算法之一,且无安全性问题
- Non-crypto:包含了一组快速non-cryptography哈希算法:Farm, City, xxHash, MUM, Spooky 2, Murmur and Metro。
- Pearson:为最快的哈希算法之一,针对8位处理器设计。
- t1ha:为最快的哈希算法之一,针对64位处理器设计。
- Spooky:为最快的哈希算法之一,具有32位、64位和128位版本。
- xxHash:为最快的哈希算法之一,对短数据输入具有很好的性能。
- 等等。
参考资料
[1] William Stafford Parsons 2024年4月16日博客 ChargeHash is a New Tiny 32-Bit Hashing Algorithm With Dual-Threaded Single-Byte Processing
[2] Prof Bill Buchanan OBE FRSE 2024年4月22日博客 ChargeHash
[3] Prof Bill Buchanan OBE FRSE 2021年8月11日博客 For Hashing, The Fastest of the Fastest? … Meet t1ha