php: число только хеширует?

В php там способ дать уникальный хеш от строки, но что хеш был составлен от чисел только?

пример:

return md5(234); // returns 098f6bcd4621d373cade4e832627b4f6

но мне нужно

return numhash(234); // returns 00978902923102372190 
(20 numbers only)

проблема здесь состоит в том, что я хочу, чтобы хеширование было коротко.

править: Хорошо позвольте мне объяснить предысторию здесь. У меня есть сайт, который имеет идентификатор для каждого зарегистрированного человека, также мне нужен идентификатор для человека, чтобы использовать и обмениваться (следовательно, это не может быть слишком длинно), до сих пор идентификационная нумерация была 00001, 00002, 00003 и т.д...

  1. это заставляет некоторых людей выглядеть более важными
  2. это показывает информацию о приложении, которую я не хочу показывать.

Для фиксации точки 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

38
задан Timo Huovinen 25 July 2018 в 09:48
поделиться

3 ответа

Вы можете попробовать 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 следует использовать только только для проверяют целостность данных .

16
ответ дан 27 November 2019 в 03:15
поделиться

Прежде всего, md5 практически скомпрометирован, поэтому вам не следует использовать его ни для чего, кроме некритичного хэширования. В PHP5 есть функция hash(), смотрите http://www.php.net/manual/en/function.hash.php.

Установив последний параметр в true, вы получите строку двоичных данных. В качестве альтернативы можно разделить полученный шестнадцатеричный хэш на части по 2 символа и преобразовать их в целые числа по отдельности, но я ожидаю, что это будет намного медленнее.

1
ответ дан 27 November 2019 в 03:15
поделиться

Хэш MD5 или SHA1 в PHP возвращает шестнадцатеричное число, поэтому все, что вам нужно сделать, это преобразовать основания. В PHP есть функция, которая может сделать это за вас:

$bignum = hexdec( md5("test") );

или

$bignum = hexdec( sha1("test") );

Руководство по PHP для hexdec

Поскольку вам нужен ограниченный размер, вы можете затем использовать модульное деление, чтобы поместить его в желаемый диапазон.

$smallnum = $bignum % [put your upper bound here]

РЕДАКТИРОВАТЬ

Как отметил Артефакто в комментариях, использование этого подхода приведет к получению числа, превышающего максимальный размер целого числа в PHP, и результат после модульного деления всегда будет равен 0. Однако, взяв подстроку из числа хеш, содержащий первые 16 символов, не имеет этой проблемы. Исправленная версия для вычисления начального большого числа:

$bignum = hexdec( substr(sha1("test"), 0, 15) );
62
ответ дан 27 November 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: