В php там способ дать уникальный хеш от строки, но что хеш был составлен от чисел только?
пример:
return md5(234); // returns 098f6bcd4621d373cade4e832627b4f6
но мне нужно
return numhash(234); // returns 00978902923102372190
(20 numbers only)
проблема здесь состоит в том, что я хочу, чтобы хеширование было коротко.
править: Хорошо позвольте мне объяснить предысторию здесь. У меня есть сайт, который имеет идентификатор для каждого зарегистрированного человека, также мне нужен идентификатор для человека, чтобы использовать и обмениваться (следовательно, это не может быть слишком длинно), до сих пор идентификационная нумерация была 00001, 00002, 00003 и т.д...
Для фиксации точки 1 и 2, я должен "скрыть" число при сохранении этого уникальным.
Числовая хеш-функция на основе кода https://stackoverflow.com/a/23679870/175071
/**
* Return a number only hash
* https://stackoverflow.com/a/23679870/175071
* @param $str
* @param null $len
* @return number
*/
public function numHash($str, $len=null)
{
$binhash = md5($str, true);
$numhash = unpack('N2', $binhash);
$hash = $numhash[1] . $numhash[2];
if($len && is_int($len)) {
$hash = substr($hash, 0, $len);
}
return $hash;
}
// Usage
numHash(234, 20); // always returns 6814430791721596451
Вы можете попробовать crc32 ()
. См. Документацию по адресу: http://php.net/manual/en/function.crc32.php
$checksum = crc32("The quick brown fox jumped over the lazy dog.");
printf("%u\n", $checksum); // prints 2191738434
С учетом сказанного, crc
следует использовать только только для проверяют целостность данных
.
Прежде всего, md5 практически скомпрометирован, поэтому вам не следует использовать его ни для чего, кроме некритичного хэширования.
В PHP5 есть функция hash()
, смотрите http://www.php.net/manual/en/function.hash.php.
Установив последний параметр в true, вы получите строку двоичных данных. В качестве альтернативы можно разделить полученный шестнадцатеричный хэш на части по 2 символа и преобразовать их в целые числа по отдельности, но я ожидаю, что это будет намного медленнее.
Хэш MD5 или SHA1 в PHP возвращает шестнадцатеричное число, поэтому все, что вам нужно сделать, это преобразовать основания. В PHP есть функция, которая может сделать это за вас:
$bignum = hexdec( md5("test") );
или
$bignum = hexdec( sha1("test") );
Поскольку вам нужен ограниченный размер, вы можете затем использовать модульное деление, чтобы поместить его в желаемый диапазон.
$smallnum = $bignum % [put your upper bound here]
РЕДАКТИРОВАТЬ
Как отметил Артефакто в комментариях, использование этого подхода приведет к получению числа, превышающего максимальный размер целого числа в PHP, и результат после модульного деления всегда будет равен 0. Однако, взяв подстроку из числа хеш, содержащий первые 16 символов, не имеет этой проблемы. Исправленная версия для вычисления начального большого числа:
$bignum = hexdec( substr(sha1("test"), 0, 15) );