|
туры);
r x — символ с нулевым кодом;
r X — возврат назад на 1 байт;
r @ — заполнение нулевым кодом до заданной абсолютной позиции.
Немало, не правда ли? Вот пример использования этой функции:
Часть IV. Стандартные функции PHP 222
// Целое, целое, все остальное — символы
$bindata = pack("nvc*", 0x1234, 0x5678, 65, 66);
После выполнения приведенного кода в строке $bindata будет содержаться 6 байтов
в такой последовательности: 0x12, 0x34, 0x78, 0x56, 0x41, 0x42 (в
шестнадцатерич-
ной системе счисления).
array unpack(string $format, string $data)
Функция unpack() выполняет действия, обратные pack() — распаковывает строку
$data, пользуясь информацией о формате $format. Возвращает она ассоциативный
массив, содержащий элементы распакованных данных. Строка $format задается
немного в другом формате, чем в функции pack(), а именно, после каждого специ-
фикатора (или после завершающего его числа) должно "впритык" следовать имя
ключа в ассоциативном массиве. Разделяются параметры при помощи символа /.
Например:
$array=unpack("c2chars/nint", $bindata);
В результирующий массив будут записаны элементы с ключами: chars1, chars2 и
int. Как видим, если после спецификатора задано число, то к имени ключа будут
добавлены номера 1, 2 и т. д., т. е. в массиве появятся несколько ключей,
отличаю-
щихся суффиксами.
Когда бывают полезны функции pack() и unpack()? Например, вы считали участок
GIF-файла, содержащий его размер в пикселах, и хотите преобразовать бинарную
32-
битную ячейку памяти в формат, понятный PHP. Или, наоборот, стремитесь работать
с файлами с фиксированным размером записи. В этом случае вам и пригодятся рас-
сматриваемые функции. Вообще говоря, функции pack() и unpack() применяются
сравнительно редко. Это связано с тем, что в PHP практически все действия,
которые
могут потребовать работы с бинарными данными (например, анализ файла с рисун-
ком с целью определения его размера), уже реализованы в виде встроенных функций
(в нашем примере с GIF-картинкой это GetImageSize()).
Хэш-функции
string md5(string $st)
Возвращает хэш-код строки $st, основанный на алгоритме корпорации RSA Data
Security под названием "MD5 Message-Digest Algorithm". Хэш-код — это просто
строка, практически уникальная для каждой из строк $st. То есть вероятность
того,
что две разные строки, переданные в $st, дадут нам одинаковый хэш-код,
стремится
к нулю.
Глава 12. Строковые функции 223
Я где-то читал об одном опыте, в котором принимали участие более 1000 мощ-
ных компьютеров, на протяжении года генерировавшие хэш-коды для строк, и
за все время не было обнаружено ни одного совпадения MD5-кодов для раз-
личных строк. Более того, математически доказано, что они могли бы с тем же
результатом заниматься этим на протяжении еще нескольких тысяч лет.
В то же время, если длина строки $st может достигать нескольких тысяч символов,
то ее MD5-код занимает максимум 32 символа.
Для чего нужен хэш-код и, в частности, алгоритм MD5? Например, для проверки па-
ролей на истинность. Пусть, к примеру, у нас есть система со многими
пользователя-
ми, каждый из которых имеет свой пароль. Можно, конечно, хранить все эти пароли
в обычном виде, или зашифровать их каким-нибудь способом, но тогда велика веро-
ятность того, что в один прекрасный день этот файл с паролями у вас украдут.
Если
пароли были зашифрованы, то, зная метод шифрования, не составит особого труда
их
раскодировать. Однако можно поступить другим способом, при использовании кото-
рого даже если файл с паролями украдут, расшифровать его будет математически
невозможно. Сделаем так: в файле паролей будем хранить не сами пароли, а их
(MD5) хэш-коды. При попытке какого-либо пользователя войти в систему мы вычис-
лим хэш-код только что введенного им пароля и сравним его с тем, который
записан
у нас в базе данных. Если коды совпадут, значит, все в порядке, а если нет —
что ж,
извините...
Конечно, при вычислении хэш-кода какая-то часть информации о с
|
|