Похож на хеш-значения, но возвращает - PullRequest
0 голосов
/ 22 января 2012

Использование хеш-функции MD5 в строке создает очень длинное значение и каждый раз создает одно и то же значение для одной и той же строки.Теперь мой вопрос: есть ли способ сделать что-то похожее, например, дать ему строку, и она каждый раз возвращает одно и то же целое число, а также целые числа, которые он возвращает для другой строки, находятся внутри определенного интервала.Я имею в виду что-то вроде this .

Пример: Дайте это "У Мэри был маленький ягненок".и он возвращает значение 10. Дайте ту же строку, он снова возвращает 10.

Пожалуйста, спросите, если я не совсем понял.

Ответы [ 2 ]

1 голос
/ 23 января 2012

Вы можете использовать младшие байты хеша MD5. Вы должны учитывать, что JavaScript (по крайней мере в Firefox 9) может использовать что-то вроде 48 бит (6 байт) для хранения точных целых чисел, длина хеша MD5 с другой стороны составляет 128 бит (16 байт). Таким образом, у вас обязательно будет больше коллизий хешей, чем вы обычно получаете с MD5. Но все же:

function toHashCode(str)
{
  // Convert string to an array of bytes
  var array = Array.prototype.slice.call(str);

  // Create MD5 hash
  var hashEngine = Components.classes["@mozilla.org/security/hash;1"]
                             .createInstance(Components.interfaces.nsICryptoHash);
  hashEngine.init(hashEngine.MD5);
  hashEngine.update(array, array.length);
  var hash = hashEngine.finish(false);

  // Turn the first 6 bytes of the hash into a number
  var result = 0;
  for (var i = 0; i < 6; i++)
    result = result * 256 + hash.charCodeAt(i);
  return result;
}

alert(toHashCode("test"));  // Displays 265892827251497
alert(toHashCode("Mary had a little lamb."));   // Displays 117938552300214
1 голос
/ 22 января 2012

Вы описываете "хэш-функцию".Посмотрите в Википедии.

MD5 - это один из видов хеш-функций.Большинство реализаций MD5 возвращают строку, но эта строка является просто представлением (LARGE) целого числа.Вы можете взять хеш MD5, а затем использовать столько младших битов, сколько вам нужно, чтобы получить целое число нужного размера.Если требуемый диапазон не является степенью 2, вам потребуется выполнить операцию по модулю, чтобы получить его в нужном диапазоне.

Кроме того, практически каждый современный язык программирования имеет встроенную функцию для хеширования строк,который возвращает целое число.В Java это String.hashCode ().В Ruby это String # hash.

В данном случае это язык Javascript, который (я был потрясен, узнав) не имеет чего-то подобного. Это String.hashCode ()с платформы Java (возможно, вы можете перенести его на Javascript):

public int hashCode() {
int h = hash;
if (h == 0) {
    int off = offset;
    char val[] = value;
    int len = count;

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }
        hash = h;
    }
    return h;
}
...