Как получить согласованный хэш / спектр из n точек при 32-байтовой строке md5 - PullRequest
2 голосов
/ 11 июня 2019

Я хотел бы взять хеш md5 некоторого содержимого, а затем сгенерировать, так сказать, «кривую» или «спектр» из n точек. То есть для построения, скажем, 5, 10 или 20 точек на линии от 0 до 1, распределенных таким образом, чтобы он был уникальным для хеша md5 (коллизии не имеют большого значения). В основном это будет выглядеть как спектр излучения атомного света.

enter image description here

enter image description here

Эти точки (или линии в спектрах) каким-то образом генерируются на основе предоставленного хеша md5 и предоставленного n, указывающего, сколько строк вы хотите.

Так было бы как:

function generateSpecrum(md5, n) { return [ ... ] }

По умолчанию он может просто возвращать значения в диапазоне от 0 до 1, но, возможно, вы даете ему начальное и конечное значение, из которого можно сгенерировать диапазон.

Хотите знать, как это можно сделать, в псевдокоде или в JS.

Однако будет много возможностей стандартного хеша md5. Я бы просто сделал это:

var crypto = require('crypto')
var data = 'foo'
crypto.createHash('md5').update(data).digest('hex')
// acbd18db4cc2f85cedef654fccc4a4d8

Итак, 32-байтовая строка. В моем случае ему не нужно создавать глобально уникальные значения, могут быть некоторые коллизии, но если бы у него был способ генерировать разнообразные спектры из разных входов md5, это было бы здорово.

1 Ответ

3 голосов
/ 12 июня 2019

Давайте проигнорируем часть, в которой строковые данные представляют собой отпечаток md5, и вместо этого сосредоточимся на том, как сделать это для шестнадцатеричных строк произвольной длины, поэтому мы можем использовать любой дайджест, который нам нравится (от CRC32 до SHA-512):

  1. начните с градиентного фона оттенка (мы можем сделать это в CSS),
  2. превратите строку в битовый шрифт (встроенный в JS) и
  3. black outлюбая область, соответствующая нулевому биту.

В качестве исполняемого фрагмента:

function hexstr2bin(stringinput) {
  // let's not be constrained by JS integer precision,
  // which is only good for 53 bits. Technically we don't
  // care what the "numbers" are here, we just want the
  // ones and zeros that the numbers turn into.
  return stringinput.split('').map(c => (
    parseInt(c, 16).toString(2).padStart(4,'0')
  )).join('');
}

function renderSpectrum(stringinput) {
  let cvs = document.createElement('canvas');
  let bits = Array.from(hexstr2bin(stringinput));

  cvs.width = bits.length;
  cvs.height = 1;
  ctx = cvs.getContext('2d');
  ctx.strokeStyle = 'black';
 
  bits.forEach( (bit,i) => {
    if (bit === "0") {
      ctx.moveTo(i,0);
      ctx.lineTo(i,1);
      ctx.stroke();
    }
  });

  document.body.appendChild(cvs);
};

renderSpectrum("acbd18db4fccc4a4d8");
renderSpectrum("c5887c91d0002f2a869a4b0772827701");
renderSpectrum("06956ff032d78e090d0d292aa9d8e7143ab08cf1ed444944529f79a4f937306a");
canvas {
  width: 100%;
  height: 40px;
  background: linear-gradient(
    to right,
    violet, blue, cyan, green, yellow, orange, red
  );
}

А растягивание холста до ширины 100% означает, что вы получаете размытие бесплатно.Бонус!

...