Intereting Posts
PHP для чтения значения DB, JS для его увеличения, AJAX для сохранения в DB, ​​но почему он по умолчанию 0.0 до обновления страницы? как я могу проверить все элементы массива одинаковые? Передача SMS / текстовых сообщений через PHP Как отсортировать результаты MySQL с буквами сначала, символы последними? Использование короткого замыкания для получения первой ненулевой переменной Не удается отправить учетную запись gmail с помощью функции mail () PHPExcel Сохранить файл xls в определенной папке Как настроить работу cron в Magento Не помещается на место, пакет, загруженный классом, требуется от композитора, делает php throw Класс не найден Каков ваш оптимизатор веб-ресурсов «все-в-одном»? setImageBias не работает в поле LAMP Как обновить веб-страницу без перезагрузки веб-страницы с помощью AJAX? Отправка простого прикрепленного файла через функцию PHP mail () PHP – передать скрытое значение в jquery SQL-инъекции в ADOdb и общая безопасность веб-сайта

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

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

пример:

return md5(234); // returns 098f6bcd4621d373cade4e832627b4f6 

но мне нужно

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

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

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

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

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

Хэш 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) ); 

Вы можете попробовать 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 .

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

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

crc32() :

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

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

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

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

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

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

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

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

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

 $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>'; 

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

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

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

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