Разработать собственный алгоритм "Хэш" - PullRequest
0 голосов
/ 12 ноября 2018

Итак, я получил целочисленную переменную между 1 and 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))

1 Ответ

0 голосов
/ 13 ноября 2018

Вот хеш-функция, которая, кажется, делает то, что вы просите :) В качестве бонуса, она не предлагает коллизий до 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...