Mhash count: примеры (PHP)

Использование mhash_count для работы с алгоритмами хеширования
Раздел: Хеширование и шифрование
mhash_count: int
Описание функции mhash_count

Функция mhash_count возвращает максимальный доступный идентификатор хеш-алгоритма, поддерживаемого расширением MHash. Она не принимает параметров и возвращает целое число.

Функция использовалась в PHP для определения количества доступных алгоритмов хеширования через устаревшее расширение MHash. Основное применение - получение максимального идентификатора для итерации по всем доступным алгоритмам или проверки поддержки конкретного алгоритма.

Аргументы: функция не имеет входных параметров.

Возвращаемое значение: целое число - максимальный ID алгоритма. Если расширение MHash недоступно, функция может вернуть FALSE.

Примеры использования mhash_count
Базовый пример
// Получение максимального ID алгоритма
$max_hash_id = mhash_count();
echo 'Максимальный ID: ' . $max_hash_id;
Максимальный ID: 10
Перебор всех алгоритмов
// Получение списка всех алгоритмов
$max = mhash_count();
for ($i = 0; $i <= $max; $i++) {
    $name = mhash_get_hash_name($i);
    if ($name) {
        echo "ID $i: $name\n";
    }
}
ID 0: CRC32
ID 1: MD5
ID 2: SHA1
ID 3: HAVAL256
ID 4: RIPEMD160
Альтернативы в PHP

Расширение MHash считается устаревшим. Современные альтернативы:

Функция возвращает массив с именами доступных алгоритмов хеширования. Она предпочтительнее, так как работает с современным расширением Hash, включенным в PHP по умолчанию.

$algorithms = hash_algos();
print_r($algorithms);
Array
(
    [0] => md2
    [1] => md4
    [2] => md5
    [3] => sha1
    [4] => sha224
)
openssl_get_md_methods()

Возвращает список алгоритмов, поддерживаемых расширением OpenSSL. Используется при работе с криптографическими функциями OpenSSL.

Аналоги в других языках

Mhash count в Python

В Python используется модуль hashlib. Для получения списка алгоритмов применяется атрибут hashlib.algorithms_available.

import hashlib
print('Доступные алгоритмы:')
for algo in sorted(hashlib.algorithms_available):
    print(f'  {algo}')
Доступные алгоритмы:
  blake2b
  blake2s
  md5
  sha1
  sha256
JavaScript (Node.js)

В Node.js используется модуль crypto. Список алгоритмов получается через crypto.getHashes().

const crypto = require('crypto');
console.log(crypto.getHashes());
[ 'RSA-MD4', 'RSA-MD5', 'RSA-SHA1', 'RSA-SHA256', ... ]

Mhash count в MySQL

MySQL предоставляет различные функции хеширования, но не имеет прямой аналогии для получения списка алгоритмов.

-- Пример использования хеш-функций
SELECT MD5('text'), SHA1('text'), SHA2('text', 256);
Типичные ошибки
Использование в PHP 8+

Расширение MHash удалено в PHP 8.0, что приводит к фатальной ошибке.

// PHP 8.0 и выше
$max = mhash_count();
echo $max;
Fatal error: Uncaught Error: Call to undefined function mhash_count()
Отсутствие расширения MHash

При неподключенном расширении функция недоступна.

if (!function_exists('mhash_count')) {
    echo 'Расширение MHash не доступно';
}
Расширение MHash не доступно
Некорректная интерпретация результата

ID алгоритмов начинаются с 0, поэтому максимальное количество алгоритмов равно mhash_count() + 1.

$max_id = mhash_count();
$total_algorithms = $max_id + 1;
echo "Всего алгоритмов: $total_algorithms";
История изменений

Функция mhash count присутствовала в PHP с версии 4 до 7.4 в рамках расширения MHash.

PHP 7.3.0

Расширение MHash получило статус устаревшего (deprecated). При использовании функции выводилось предупреждение.

PHP 8.0.0

Расширение MHash полностью удалено из ядра PHP. Функция mhash count больше недоступна. Рекомендуется миграция на современное расширение Hash.

Альтернативный подход

Для обратной совместимости в ранних версиях можно было использовать условные проверки:

if (extension_loaded('hash')) {
    $algorithms = hash_algos();
} elseif (extension_loaded('mhash')) {
    $max = mhash_count();
    // обработка через MHash
}
Расширенные примеры
Сравнение поддержки алгоритмов
Пример php
// Сравнение алгоритмов MHash и Hash
if (function_exists('mhash_count')) {
    $mhash_algorithms = [];
    $max = mhash_count();
    for ($i = 0; $i <= $max; $i++) {
        $name = mhash_get_hash_name($i);
        if ($name) $mhash_algorithms[] = strtolower($name);
    }
    
    $hash_algorithms = hash_algos();
    
    $only_in_mhash = array_diff($mhash_algorithms, $hash_algorithms);
    $only_in_hash = array_diff($hash_algorithms, $mhash_algorithms);
    
    echo 'Только в MHash: ' . implode(', ', $only_in_mhash) . "\n";
    echo 'Только в Hash: ' . implode(', ', $only_in_hash);
}
Только в MHash: crc32, haval256, ripemd160
Только в Hash: sha224, sha256, sha384, sha512, sha512/224
Автоматический выбор алгоритма
Пример php
// Выбор алгоритма в зависимости от доступности
function get_hash_function($preferred = 'sha256') {
    if (function_exists('hash')) {
        return function($data) use ($preferred) {
            return hash($preferred, $data);
        };
    } elseif (function_exists('mhash_count')) {
        $max = mhash_count();
        for ($i = 0; $i <= $max; $i++) {
            if (strtolower(mhash_get_hash_name($i)) === $preferred) {
                return function($data) use ($i) {
                    return bin2hex(mhash($i, $data));
                };
            }
        }
        // Fallback to SHA1
        return function($data) {
            return bin2hex(mhash(MHASH_SHA1, $data));
        };
    }
    return false;
}

$hasher = get_hash_function('sha256');
if ($hasher) {
    echo $hasher('test data');
}
Миграционный код с MHash на Hash
Пример php
// Обертка для совместимости с устаревшим кодом
if (!function_exists('mhash_count') && function_exists('hash_algos')) {
    function legacy_mhash_count() {
        $algos = hash_algos();
        // Эмулируем схожий диапазон ID
        return count($algos) - 1;
    }
    
    function legacy_mhash($hashid, $data) {
        $mapping = [
            0 => 'crc32',
            1 => 'md5',
            2 => 'sha1',
            3 => 'haval256,3',
            4 => 'ripemd160'
        ];
        
        if (isset($mapping[$hashid])) {
            return hash($mapping[$hashid], $data, true);
        }
        return false;
    }
}

PHP mhash_count function comments

En
Mhash count Gets the highest available hash id