依旧1/1,000,000碰撞率自制哈希算法

9 阅读1分钟

不知为何发现了一个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;
}

(如有巧合,请告诉我喵)