Hash algos: примеры (PHP)

Полное руководство по 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

В Python модуль hashlib предоставляет атрибут algorithms_available, возвращающий множество поддерживаемых алгоритмов.

import hashlib
print(hashlib.algorithms_available)
{'sha3_512', 'blake2b', 'sha384', 'md5', 'sha256', ...}
JavaScript (Node.js): crypto.getHashes()

В Node.js модуль crypto содержит функцию getHashes(), возвращающую массив строк с названиями алгоритмов.

const crypto = require('crypto');
console.log(crypto.getHashes());
['RSA-MD4', 'RSA-MD5', 'RSA-SHA1', 'RSA-SHA1-2', ...]
MySQL: SHOW STATEMENT

В 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 8.1, функция всегда возвращает массив, содержащий алгоритмы, соответствующие текущей конфигурации. Ранее поведение могло незначительно отличаться.

Добавление алгоритмов

В различных версиях PHP добавлялись новые алгоритмы. Например, в PHP 7.1 добавлены алгоритмы серии sha3 (sha3-224, sha3-256, sha3-384, sha3-512). В PHP 7.2 добавлены алгоритмы серии Blake2 (blake2b, blake2s).

Расширенные примеры

Сравнение скорости алгоритмов

Пример сравнения времени хеширования для разных алгоритмов.

Пример php
<?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
<?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
<?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

PHP hash_algos function comments

En
Hash algos Return a list of registered hashing algorithms