Подтвердить что ты не робот

Php: число только хеш?

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

Пример:

return md5(234); // returns 098f6bcd4621d373cade4e832627b4f6

но мне нужно

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

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

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

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

Чтобы исправить точки 1 и 2, мне нужно "скрыть" число, сохраняя при этом его уникальность.

4b9b3361

Ответ 1

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

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

или

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

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

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

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

ИЗМЕНИТЬ

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

$bignum = hexdec( substr(sha1("test"), 0, 15) );

Ответ 2

Вы можете попробовать 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 следует использовать только для validate the integrity of data.

Ответ 3

Проблема отсечения хэша - это столкновения, чтобы избежать попытки:

return  hexdec(crc32("Hello World"));

crc32():

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

Это дает нам целое число 32 бит, отрицательное в 32-битной установке или положительное в 64 бит. Это целое число может храниться как идентификатор в базе данных. У этого нет проблем с конфликтами, потому что он вписывается в переменную 32 бит, как только вы преобразуете ее в десятичную с помощью функции hexdec().

Ответ 4

Есть несколько хороших ответов, но для меня подходы кажутся глупыми.
Они сначала заставляют php создавать шестнадцатеричное число, а затем преобразовывать его обратно (hexdec) в BigInteger, а затем сокращать его до нескольких букв... это много работает!

Вместо этого почему не

Прочитайте хэш как двоичный:

$binhash = md5('[input value]', true);

затем используя

$numhash = unpack('N2', $binhash); //- or 'V2' for little endian

чтобы использовать это как два INT ($numhash - это массив из двух элементов). Теперь вы можете уменьшить количество бит в номере, просто используя операцию AND. например:

$result = $numhash[1] & 0x000FFFFF; //- to get numbers between 0 and 1048575

Но будьте осторожны при столкновении! Сокращение числа означает увеличение вероятности двух разных [входных значений] с тем же выходом.

Я думаю, что гораздо лучшим способом было бы использование "ID-Crypting" с функцией Bijectiv. Поэтому никаких столкновений не могло быть! Для простейшего типа просто используйте Affine_cipher

Пример с максимальным диапазоном входных значений от 0 до 25:

function numcrypt($a)
{
   return ($a * 15) % 26;
}

function unnumcrypt($a)
{
   return ($a * 7) % 26;
}

Вывод:

numcrypt(1) : 15
numcrypt(2) : 4
numcrypt(3) : 19

unnumcrypt(15) : 1
unnumcrypt(4)  : 2
unnumcrypt(19) : 3

например.

$id = unnumcrypt($_GET('userid'));

... do something with the ID ...

echo '<a href="do.php?userid='. numcrypt($id) . '"> go </a>';

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

Ответ 5

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

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

Ответ 6

Попробуйте hashid.
Он hash число в формате, который вы можете определить. Форматы включают, сколько символов, и какой символ включен.
Пример:
$ Hashids- > закодировать (1);
Возврат "28630" зависит от вашего формата,