Mhash count: примеры (PHP)
mhash_count: intФункция mhash_count возвращает максимальный доступный идентификатор хеш-алгоритма, поддерживаемого расширением MHash. Она не принимает параметров и возвращает целое число.
Функция использовалась в PHP для определения количества доступных алгоритмов хеширования через устаревшее расширение MHash. Основное применение - получение максимального идентификатора для итерации по всем доступным алгоритмам или проверки поддержки конкретного алгоритма.
Аргументы: функция не имеет входных параметров.
Возвращаемое значение: целое число - максимальный ID алгоритма. Если расширение MHash недоступно, функция может вернуть FALSE.
// Получение максимального 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
Расширение MHash считается устаревшим. Современные альтернативы:
Функция возвращает массив с именами доступных алгоритмов хеширования. Она предпочтительнее, так как работает с современным расширением Hash, включенным в PHP по умолчанию.
$algorithms = hash_algos();
print_r($algorithms);
Array
(
[0] => md2
[1] => md4
[2] => md5
[3] => sha1
[4] => sha224
)
Возвращает список алгоритмов, поддерживаемых расширением 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
В 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);Расширение MHash удалено в PHP 8.0, что приводит к фатальной ошибке.
// PHP 8.0 и выше
$max = mhash_count();
echo $max;
Fatal error: Uncaught Error: Call to undefined function mhash_count()
При неподключенном расширении функция недоступна.
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.
Расширение MHash получило статус устаревшего (deprecated). При использовании функции выводилось предупреждение.
Расширение MHash полностью удалено из ядра PHP. Функция mhash count больше недоступна. Рекомендуется миграция на современное расширение Hash.
Для обратной совместимости в ранних версиях можно было использовать условные проверки:
if (extension_loaded('hash')) {
$algorithms = hash_algos();
} elseif (extension_loaded('mhash')) {
$max = mhash_count();
// обработка через MHash
}// Сравнение алгоритмов 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
// Выбор алгоритма в зависимости от доступности
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');
}
// Обертка для совместимости с устаревшим кодом
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;
}
}