javascript - 开发自己的 "Hash"算法

标签 javascript string algorithm math hash

所以我得到了一个介于 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/

相关文章:

javascript - 将多个纹理映射到 3D 立方体,但只显示一个

javascript - Highcharts 系列更新动画

c++ - 获取指针的子串

r - 按列和按行进行子集化?

algorithm - 向用户建议标签列表的算法

javascript - 使用正则表达式解析 'min:sec' 字符串

javascript - 在 Azure AD B2C 中获取 token 时出现 CORS 问题(隐式流)

android - 在 Text View android 中设置 Span 样式的 HTML 文本

string - 在 Scala 中实现不区分大小写比较的字符串类

algorithm - Code Golf : combining multiple sorted lists into a single sorted list