PHP хеш-функция, которая возвращает целое число (32-битное int) - PullRequest
5 голосов
/ 15 декабря 2011

Цель состоит в том, чтобы сохранить хэш в базе данных MySQL, используя INT (не BIGINT или MEDIUMINT). md5('string', true) возвращает двоичные данные, 16 байтов хэша. Я думал, что смогу получить первые 4 байта и преобразовать их в целое число INT (32 бита / 4 байта), но я не знаю, как это сделать.

Что вы предлагаете? Спасибо.

Ответы [ 4 ]

14 голосов
/ 15 декабря 2011

Используйте crc32, он вернет 32-битный int.


var_dump (crc32 ("hello world"));
var_dump (crc32 ("world hello"));

выход

int(222957957)
int(1292159901)

PHP: crc32 - Руководство

Генерирует полином циклической контрольной суммы избыточности 32-битных длин строки.Обычно это используется для проверки целостности передаваемых данных.

Поскольку целочисленный тип PHP подписан, а многие контрольные суммы crc32 приводят к отрицательным целым числам, вам необходимо использовать формататор "% u" функции sprintf ()или printf (), чтобы получить строковое представление контрольной суммы crc32 без знака.

2 голосов
/ 15 декабря 2011
ord($hash[0]) * 16777216 + ord($hash[1]) * 65536 + ord($hash[2]) * 256 + ord($hash[3]) ;

Или:

unpack("L", substr($hash,0,4));

Но решение Филиппа Розена лучше.

0 голосов
/ 13 февраля 2017

Вот хэш Дэниела Бернштейна, который возвращает 32-битное целое число.

function djb_hash($str) {
  for ($i = 0, $h = 5381, $len = strlen($str); $i < $len; $i++) {
    $h = (($h << 5) + $h + ord($str[$i])) & 0x7FFFFFFF;
  }
  return $h;
}
0 голосов
/ 18 августа 2016

Другая альтернатива - использовать карту, чтобы связать ваш хэш с целым числом, например Redis.

L43F34FLK34FL3K4 ==> 1

LKZLCKCLK32 ==> 2

и т.....

...