对xxHash感到困惑

时间:2018-03-21 10:19:33

标签: javascript node.js hash

我正在使用xxHash从元素id创建哈希。我只是不想在网站上显示真实的身份证。我创建了脚本来测试是否有选项可以获得相同的哈希值:

const _ = require('lodash');
const XXH = require('xxhashjs');

let hashes = []
let uniq_hashes = []

for(let i = 0; i < 1000000; i++){
    var h = XXH.h32(i.toString(), 0xABCD).toString(16)
    hashes.push(h)
}

uniq_hashes = _.uniq(hashes)
console.log(hashes.length, uniq_hashes.length);

脚本的日志为1000000 999989,因此某些哈希值相同。 xxHash的工作方式是否正确?

此外,第一对是'1987'和'395360'

如果我需要真正独特的哈希(不加密)我应该使用什么?

2 个答案:

答案 0 :(得分:2)

在生日悖论中你应该看到大约1:16 ^ 2或10 ^ 6/2 ^ 16 = ~15的碰撞,所以11次碰撞似乎是正确的。 (注意:数学大大简化,请参阅Birthday problem以获得良好的数学。)

过少减少冲突会增加散列大小并使用加密散列(如SHA-256)。加密哈希函数旨在避免冲突。

答案 1 :(得分:0)

您应该使用具有更大哈希摘要的哈希。即使是32位的安全加密哈希也会最终发生不可避免的冲突。

由于您使用的是Node.js,并希望比加密哈希更快,请尝试MetroHash128murmur128CityHash128。还有CityHash256你想完全落伍。由于使用C ++绑定,这些应该非常快,并且天文学上减少了随机碰撞的可能性。

相关问题