Hash algos: примеры (PHP)
hash_algos: arrayФункция hash_algos() возвращает массив с названиями поддерживаемых алгоритмов хеширования.
Использование функции необходимо для получения списка алгоритмов, доступных в текущей версии PHP. Это полезно при динамическом выборе алгоритма или проверке поддержки конкретного метода хеширования перед использованием функций hash() или hash_init().
Функция не принимает никаких параметров. Сигнатура: hash_algos(): array.
Базовые примеры использования
Пример простого вызова функции с выводом списка.
<?php
$algorithms = hash_algos();
print_r($algorithms);
?>Array
(
[0] => md2
[1] => md4
[2] => md5
[3] => sha1
[4] => sha224
[5] => sha256
...
)Пример проверки, доступен ли алгоритм в системе.
<?php
if (in_array('sha3-256', hash_algos())) {
echo 'Алгоритм SHA3-256 поддерживается.';
} else {
echo 'Алгоритм SHA3-256 не поддерживается.';
}
?>Алгоритм SHA3-256 поддерживается.
Похожие функции в PHP
Функция hash() непосредственно вычисляет хеш строки с использованием заданного алгоритма. Использование hash_algos() предшествует вызову hash() для проверки доступности алгоритма.
Функция hash_hmac_algos() возвращает массив алгоритмов, подходящих для использования с hash_hmac(). Не все алгоритмы из hash_algos() пригодны для HMAC.
Функция hash_init() инициализирует инкрементальный контекст хеширования. Список алгоритмов для неё также можно получить через hash_algos().
Функцию hash_algos() предпочтительно использовать для предварительной проверки, в то время как остальные функции применяются для непосредственных вычислений.
Альтернативы в других языках
В Python модуль hashlib предоставляет атрибут algorithms_available, возвращающий множество поддерживаемых алгоритмов.
import hashlib
print(hashlib.algorithms_available){'sha3_512', 'blake2b', 'sha384', 'md5', 'sha256', ...}В Node.js модуль crypto содержит функцию getHashes(), возвращающую массив строк с названиями алгоритмов.
const crypto = require('crypto');
console.log(crypto.getHashes());['RSA-MD4', 'RSA-MD5', 'RSA-SHA1', 'RSA-SHA1-2', ...]
В MySQL нет прямой аналогичной функции. Информация о доступных функциях хеширования содержится в документации. Для получения хеша используется, например, функция SHA2().
SELECT SHA2('Hello', 256);185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
Типичные ошибки
Список алгоритмов может различаться в зависимости от версии PHP и настроек. Не стоит жестко полагаться на наличие конкретного алгоритма без проверки.
<?php
// Ошибка: алгоритм может быть недоступен
$hash = hash('whirlpool', 'data');
?>// В некоторых конфигурациях может возникнуть ошибка
При проверке наличия алгоритма важно учитывать регистр строк.
<?php
// Алгоритмы в списке представлены в нижнем регистре
if (in_array('SHA256', hash_algos())) { // false
echo 'Найден';
}
?>// Вывода не будет, т.к. 'SHA256' != 'sha256'
Изменения в последних версиях PHP
Начиная с PHP 8.1, функция всегда возвращает массив, содержащий алгоритмы, соответствующие текущей конфигурации. Ранее поведение могло незначительно отличаться.
В различных версиях PHP добавлялись новые алгоритмы. Например, в PHP 7.1 добавлены алгоритмы серии sha3 (sha3-224, sha3-256, sha3-384, sha3-512). В PHP 7.2 добавлены алгоритмы серии Blake2 (blake2b, blake2s).
Расширенные примеры
Пример сравнения времени хеширования для разных алгоритмов.
<?php
$data = str_repeat('sample', 1000);
$results = [];
foreach (hash_algos() as $algo) {
$start = microtime(true);
hash($algo, $data);
$time = microtime(true) - $start;
$results[$algo] = $time;
}
asort($results);
echo "Самые быстрые алгоритмы:\n";
$i = 0;
foreach ($results as $algo => $time) {
echo sprintf("%s: %.6f сек.\n", $algo, $time);
if (++$i >= 5) break;
}
?>Самые быстрые алгоритмы: md4: 0.000011 сек. md5: 0.000012 сек. tiger128,3: 0.000013 сек. ...
Пример группировки алгоритмов по их типам с использованием фильтрации по названию.
<?php
$algos = hash_algos();
$families = [];
foreach ($algos as $algo) {
if (strpos($algo, 'sha3-') === 0) {
$families['sha3'][] = $algo;
} elseif (strpos($algo, 'sha') === 0) {
$families['sha'][] = $algo;
} elseif (strpos($algo, 'md') === 0) {
$families['md'][] = $algo;
} else {
$families['other'][] = $algo;
}
}
print_r($families);
?>Array
(
[sha3] => Array
(
[0] => sha3-224
[1] => sha3-256
...
)
[sha] => Array
(
[0] => sha1
[1] => sha224
...
)
...
)Пример выбора алгоритма по заданной длине вывода.
<?php
function selectAlgoByLength(int $minLength): ?string {
foreach (hash_algos() as $algo) {
// Создаем хеш от пустой строки для определения длины
$length = strlen(hash($algo, '', true));
if ($length >= $minLength) {
return $algo;
}
}
return null;
}
$algo = selectAlgoByLength(32); // Найти алгоритм с выводом не менее 32 байт
echo "Выбранный алгоритм: " . ($algo ?? 'не найден');
?>Выбранный алгоритм: sha256