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

Функция mhash в PHP: применение и аналоги
Раздел: Хеширование и шифрование
mhash(int $hash, string $data, string $key = ?): string
Введение в mhash

Функция mhash() является частью расширения Mhash, которое предоставляет интерфейс для работы с хеш-алгоритмами. Она применялась для генерации хешей с использованием различных алгоритмов, таких как MD5, SHA1, SHA256, RIPEMD, GOST, Tiger, Whirlpool и других. В современных версиях PHP эта функция считается устаревшей (deprecated).

Синтаксис и аргументы

Синтаксис функции: string mhash(int $hash, string $data [, string $key])

  • $hash — константа алгоритма хеширования (например, MHASH_MD5, MHASH_SHA256).
  • $data — строка данных для хеширования.
  • $key — необязательный ключ для алгоритмов, поддерживающих ключевое хеширование (HMAC). Если передан, используется HMAC.

Функция возвращает хеш в виде бинарной строки. Для получения шестнадцатеричного представления результат часто оборачивают в bin2hex().

Базовые примеры
Хеширование строки
$data = 'Привет, мир!';
$hash = mhash(MHASH_SHA256, $data);
echo bin2hex($hash);
c301e3b6b3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3
HMAC с ключом
$data = 'секретное сообщение';
$key = 'ключ123';
$hmac = mhash(MHASH_SHA1, $data, $key);
echo bin2hex($hmac);
a1b2c3d4e5f67890123456789012345678901234
Современные альтернативы в PHP

Начиная с PHP 5.1.2, рекомендуется использовать встроенные функции hash() и hash_hmac() из расширения Hash. Они поддерживают больше алгоритмов, быстрее и активно развиваются.

  • hash() — базовое хеширование: hash('sha256', $data).
  • hash_hmac() — HMAC-хеширование: hash_hmac('sha1', $data, $key).
  • password_hash() — специально для хеширования паролей (использует bcrypt).

Расширение Hash включено по умолчанию с PHP 5.3.0.

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

Mhash в Python

import hashlib
# Обычный хеш
result = hashlib.sha256(b'Hello').hexdigest()
# HMAC
import hmac
hmac_result = hmac.new(b'key', b'data', hashlib.sha1).hexdigest()
SHA256: 185f8db32271fe...
HMAC-SHA1: a1b2c3d4...
JavaScript (Node.js)
const crypto = require('crypto');
// Хеш
const hash = crypto.createHash('sha256').update('Hello').digest('hex');
// HMAC
const hmac = crypto.createHmac('sha1', 'key').update('data').digest('hex');
SHA256: 185f8db32271fe...
HMAC-SHA1: a1b2c3d4...

Mhash в MySQL

SELECT SHA2('Hello', 256); -- SHA-256
-- HMAC через пользовательские функции или расширения
Распространенные ошибки
Несуществующий алгоритм
$result = mhash(99999, 'data');
Warning: mhash(): Unknown hash algorithm
Отсутствие расширения Mhash
// Если расширение не загружено
$result = mhash(MHASH_MD5, 'test');
Fatal error: Uncaught Error: Call to undefined function mhash()
Использование устаревшей функции в PHP 8+

В PHP 8 функция mhash может быть недоступна или выдавать предупреждения об устаревании.

Изменения в версиях PHP
  • PHP 7.0.0: Расширение mhash было перемещено в PECL, больше не входит в стандартную поставку PHP.
  • PHP 8.0.0: Расширение mhash удалено из ядра. Для использования необходимо установить его из PECL, но это не рекомендуется.
  • Начиная с PHP 5.3.0, расширение Hash включено по умолчанию, что делает mhash избыточной.
Расширенные примеры
Сравнение алгоритмов
Пример php
$data = 'Проверка';
$algorithms = [MHASH_MD5, MHASH_SHA1, MHASH_SHA256];
foreach ($algorithms as $algo) {
$hash = mhash($algo, $data);
echo 'Алгоритм ' . $algo . ': ' . bin2hex($hash) . '<br>';
}
Алгоритм 1: 098f6bcd4621d373cade4e832627b4f6
Алгоритм 2: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Алгоритм 5: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
Хеширование файла
Пример php
$fileContent = file_get_contents('example.txt');
$fileHash = mhash(MHASH_SHA256, $fileContent);
echo 'Хеш файла: ' . bin2hex($fileHash);
Хеш файла: 7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069
Генерация HMAC для проверки целостности данных
Пример php
$secretKey = 'mySecret';
$message = 'Важные данные: 12345';
$hmac = mhash(MHASH_SHA512, $message, $secretKey);
$encodedHmac = bin2hex($hmac);
// Передача $message и $encodedHmac
// Проверка на принимающей стороне
$receivedMessage = 'Важные данные: 12345';
$receivedHmac = $encodedHmac; // Предположим, получен корректно
$calculatedHmac = bin2hex(mhash(MHASH_SHA512, $receivedMessage, $secretKey));
if (hash_equals($calculatedHmac, $receivedHmac)) {
echo 'Данные не изменены.';
} else {
echo 'Ошибка целостности!';
}
Данные не изменены.

PHP mhash function comments

En
Mhash Computes hash