12.6. Хеширование
Хеширование представляет собой процесс создания индекса значения и использует при этом само значение. Этот индекс называется хешем. Хеш может быть уникальным, но это не всегда так. Хеши можно использовать для создания быстрых просмотров - метода, используемого в PHP для отслеживания переменных. В других случаях хеши используются для шифрования. Если хеши двух разных строк совпадают, можно сделать вывод, что совпадают и строки, так как значения хеша являются уникальными. Таким образом, пароли можно проверить даже без расшифровки первоначального пароля.
Некоторые функции, описанные в этом разделе, встроены в PHP. Другие входят в состав библиотеки Mhash, созданной Сашей Шуманом. Эта библиотека представляет собой всеобщий интерфейс, объединяющий многие алгоритмы. Больше о ней можно узнать наузле <http://schumann.cx/mhash/>.
integer crc32(string data)
Функция crc32 (листинг 12.67) возвращает 32-битовую избыточную циклическую контрольную сумму для заданных данных. Обычно этот хеш позволяет проверить то, что переданные данные не подвергались изменениям.

| Листинг 12.67. Функция crc32_
<?php
$message = "Who is John Galt?"; $crc = 1847359068; if(crc32($message) == $crc) {
print("Сообщение осталось нетронутым");
}
else
{
print("Контрольная сумма не совпадает");
}

integer ezmlm_hash(string address)
Функция ezmlm вычисляет хеш для адреса электронной почты, который используется менеджером списка рассылки EZMLM.
integer ftok(string path, string project)
Функция ftok опирается на одноименную C-функцию. Она возвращает хеш данного пути и идентификатора проекта. Аргумент project должен иметь один символ. Функция возвращает IPC-ключ System V. Ключи являются одинаковыми независимо от альтернативных путей, если они принадлежат одному и тому же файлу. Возвращаемые данной функцией ключи могут использоваться семафорными функциями, описанными в главе 19, "Разное". 
integer levenshtein(string first, string second)
integer levenshtein(string first, string second, integer insert, integer replace, integer delete)
Функция levenshtein предназначена для определения расстояния Левенштейна (Levenshtein), т.е. между двумя строками длиной 255 символов или менее. Возвращаемым значением является минимальное количество изменений, необходимых для того, чтобы преобразовать первую строку во вторую. Изменением может быть добавление, удаление или изменение одного символа.
Простая версия этой функции обрабатывает две строки. Кроме того, можно задавать цену выполнения вставок, замен и удалений соответственно. Подробнее об алгоритме расстояния Левенштейна можно узнать по адресу <http://www.merriampark.com/ld.htm>.
string md5(string text)
Функция md5 (листинг 12.68) создает хеш строго в соответствии с описанием, заданным в документе RFC 1321. Эта функция принимает строку любой длины и возвращает 32-символьный идентификатор. Теоретически допускается, что алгоритм функции md5 позволяет создавать уникальный идентификатор для любой строки.

| Листинг 12.68. Функция md5_
<?php
//bebcd56 57c9c3d6 2f9e22f2e0 73 08 6 8a print(md5("Who is John Galt?"));

string metaphone(string word)
Функция metaphone (листинг 12.69) предназначена для воспроизведения звучания слов при их произношении. Эта функция аналогична функции soundex, однако она "знает", каким образом группы букв произносятся в английском языке, и поэтому точнее. Сравните эту функцию с функциями soundex и similar_text. Алгоритм metaphone, разработанный Лоуренсом Филлипсом (Lawrence Philips), впервые был описан в журнале ComputerLanguage. Обсуждение алгоритма metaphone можно найти на Web-узле SourceForge (<http://aspell. sourceforge.net/metaphone/>).

j Листинг 12.69. Функция metaphone_
<?php
print("Atkinson encodes as " . metaphone("Atkinson"));

string mhash(integer hash, string data)
Функция mhash (листинг 12.70) используется для получения хеша строки. Алгоритмы хеширования, имевшиеся на время написания данной книги, приведены в табл. 12.10, а подробнее о каждом из них читайте в документации по Mhash.
Кодирование и декодирование
Листинг 12.70. Функция mhash

<?php
$hash = array(
MHASH_ADLER3 2, MHASH_CRC32, MHASH_CRC3 2B, MHASH_GOST,
MHASH_HAVAL128, MHASH_HAVAL160, MHASH_HAVAL192, MHASH_HAVAL224, MHASH_HAVAL256, MHASH_MD4, MHASH_MD5, MHASH_RIPEMD160, MHASH_SHA1, MHASH_SHA256, MHASH_TIGER, MHASH_TIGER128, MHASH_TIGER160);
//попробовать работу каждого из алгоритмов foreach($hash as $h)
{
$name = mhash_get_hash_name($h); $size = mhash_get_block_size($h); $key = bin2hex(mhash($h, "Who is John Galt?")); print("$name ($size): $key<br>n");
}

integer mhash_get_block_size(integer hash)
Функция mhash_get_block_size возвращает размер блока, используемого в алгоритме хеширования.
string mhash_get_hash_name(integer hash)
Функция mhash_get_hash_name возвращает имя определенного идентификатора хеша.
string mhash_keygen_s2k(integer hash, string password, string salt, integer length)
Функция mhash_keygen_s2k генерирует ключ, используя один из алгоритмов, приведенных в табл. 12.10. Что соответствует алгоритму Salted S2K, описанному в документе RFC 2440. 
string sha1(string data)
Функция sha1 возвращает хеш в соответствии с правилами алгоритма безопасного хеширования США (U.S. Secure Hash Algorithm 1), описанного в документе RFC 3174.