所以我得到了一个介于 1 和 10,000
之间的整数变量。
我想将每个数字转换为一个unique!
具有固定长度和自定义字符集(包括所有字母小写和大写字符)的哈希值.
所以:
n=10
可以到达result="AVduujANNiO"
n=4507
可以得到result="BciidEPpaEo"
我真的不知道如何开发这样的算法,所以这就是我到目前为止所知道的。我认为该算法应该有效,但当然我得到一个整数值作为散列 - 而不是字母值。不知道如何解决这个问题以及如何填充结果以使其具有固定长度。
我真的希望有人能帮助我。
let value = "3325";
var getHash = function(value) {
let hash = 0;
for (let i = 0; i < value.length; i++) {
let char = value.charCodeAt(i);
hash = (hash << 6) + char + (char << 14);
hash=-hash
} return hash;
};
console.log(getHash(value))
最佳答案
这是一个哈希函数,它似乎可以满足您的要求:) 作为奖励,它在 100,000 之前不会发生冲突。
function h(n){
let s = [
'0101000', '1011010', '0011111',
'1100001', '1100101', '1011001',
'1110011', '1010101', '1000111',
'0001100', '1001000'].map(x => parseInt(x, 2));
let m = parseInt('101', 2);
s = s.map(x => {
n ^= m;
m <<= 1;
return (x ^ n) % 52;
});
return s.map(x =>
String.fromCharCode(x > 25 ? 71 + x : 65 + x)
).join('');
}
const s = {};
for (let j=1; j <=10000; j++){
let hash = h(j);
if (s[hash])
console.log('Collision! ' + j + ' <-> ' + s[hash]);
s[hash] = j;
}
console.log('Done. No collisions below 10000.');
for (let j=1; j <11; j++)
console.log(j, h(j));
关于javascript - 开发自己的 "Hash"算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53269191/