不知为何发现了一个1/1,000,000碰撞率的哈希算法
先说结构,我查了一下AI,前沿的哈希算法用的是
『海绵结构』
意思就是把数据先揉再挤,这个算法最6的地方在于 揉 函数这里
uint64_t knead(uint64_t x) {
return (x * x * 227 << 1) + x * 16;
}
我之前是没用227这个数字的,可改成这个数字后,碰撞率极速下跌
对!就是变成了 1/1,000,000!
这里是源码!
#include <iostream>
#include <unordered_set>
using namespace std;
uint64_t knead(uint64_t x) {
return (x * x * 227 << 1) + x * 16;
}
uint64_t squeeze(uint64_t x) {
return x * 164 / 56 + x * x - x;
}
uint64_t my_hash(uint64_t input) {
uint64_t state = 0;
uint64_t chunks[8];
uint64_t mask = 0xFF;
for (int i = 0; i < 8; i++) {
chunks[i] = (input >> (i * 8)) & mask;
}
for (int i = 0; i < 8; i++) {
state = knead(state ^ chunks[i]);
}
return squeeze(state);
}
// 测试代码示例
int main() {
unordered_set<uint64_t> results;
long long int collisions = 0;
for (uint64_t i = 0; i < 1000000; i++) {
uint64_t h = my_hash(i);
if (results.find(h) != results.end()) {
collisions++;
}
results.insert(h);
}
cout << "Collisions: " << collisions;
}
(如有巧合,请告诉我喵)