Mhash: примеры (PHP)
mhash(int $hash, string $data, string $key = ?): stringФункция 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
$data = 'секретное сообщение';
$key = 'ключ123';
$hmac = mhash(MHASH_SHA1, $data, $key);
echo bin2hex($hmac);a1b2c3d4e5f67890123456789012345678901234
Начиная с 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...
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
// Если расширение не загружено
$result = mhash(MHASH_MD5, 'test');Fatal error: Uncaught Error: Call to undefined function mhash()
В PHP 8 функция mhash может быть недоступна или выдавать предупреждения об устаревании.
- PHP 7.0.0: Расширение mhash было перемещено в PECL, больше не входит в стандартную поставку PHP.
- PHP 8.0.0: Расширение mhash удалено из ядра. Для использования необходимо установить его из PECL, но это не рекомендуется.
- Начиная с PHP 5.3.0, расширение Hash включено по умолчанию, что делает mhash избыточной.
$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
$fileContent = file_get_contents('example.txt');
$fileHash = mhash(MHASH_SHA256, $fileContent);
echo 'Хеш файла: ' . bin2hex($fileHash);Хеш файла: 7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069
$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 'Ошибка целостности!';
}Данные не изменены.