我正在使用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'
如果我需要真正独特的哈希(不加密)我应该使用什么?
答案 0 :(得分:2)
在生日悖论中你应该看到大约1:16 ^ 2或10 ^ 6/2 ^ 16 = ~15的碰撞,所以11次碰撞似乎是正确的。 (注意:数学大大简化,请参阅Birthday problem以获得良好的数学。)
过少减少冲突会增加散列大小并使用加密散列(如SHA-256)。加密哈希函数旨在避免冲突。
答案 1 :(得分:0)
您应该使用具有更大哈希摘要的哈希。即使是32位的安全加密哈希也会最终发生不可避免的冲突。
由于您使用的是Node.js,并希望比加密哈希更快,请尝试MetroHash128或murmur128或CityHash128。还有CityHash256你想完全落伍。由于使用C ++绑定,这些应该非常快,并且天文学上减少了随机碰撞的可能性。