首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

MD5 16位二進制與 32位十六進制字符串互轉

     編輯:PHP 相關知識

PHP md5() 函數支持雙輸出格式:32 位十六進制字符串(默認)與 16 位二進制字符串(raw_output=true)。本文展示兩種格式的互轉方法,適用於數據庫存儲優化、二進制傳輸等場景。

格式對比

格式長度獲取方式特點
十六進制字符串32 字符md5($str)可讀、易存儲、易傳輸
二進制字符串16 字節md5($str, true)體積減半、需轉義存儲

互轉核心代碼

<?php
$str = 'test';

// 1. 獲取兩種格式
$hex32 = md5($str);        // 32 位十六進制
$raw16 = md5($str, true);  // 16 位二進制

// 2. 二進制 → 十六進制 (核心:unpack + implode)
$hexFromRaw = implode(unpack('H*', $raw16));

// 3. 十六進制 → 二進制 (核心:pack)
$rawFromHex = pack('H*', $hex32);

// 驗證
echo '原始字符串: ' . $str . "\n";
echo '32位十六進制: ' . $hex32 . "\n";
echo '16位二進制(urlencode): ' . urlencode($raw16) . "\n";
echo '轉換回32位: ' . $hexFromRaw . "\n";
echo '轉換回16位(urlencode): ' . urlencode($rawFromHex) . "\n";

// 輸出示例:
/*
原始字符串: test
32位十六進制: 098f6bcd4621d373cade4e832627b4f6
16位二進制(urlencode): %09%8Fk%CDF!%D3s%CA%DE%N%83%26%27%B4%F6
轉換回32位: 098f6bcd4621d373cade4e832627b4f6
轉換回16位(urlencode): %09%8Fk%CDF!%D3s%CA%DE%N%83%26%27%B4%F6
*/
?>

函數封裝

<?php
/**
 * 32位十六進制 MD5 轉 16位二進制
 */
function md5_hex2raw($hex32) {
    return pack('H*', $hex32);
}

/**
 * 16位二進制 MD5 轉 32位十六進制
 */
function md5_raw2hex($raw16) {
    return implode(unpack('H*', $raw16));
}

/**
 * 直接計算 16位二進制 MD5
 */
function md5_raw($str) {
    return md5($str, true);
}

// 使用
$password = 'secret123';
$raw = md5_raw($password);      // 存入 BINARY(16) 字段
$hex = md5_raw2hex($raw);       // 顯示/傳輸時轉回
?>

應用場景

  1. 數據庫存儲優化:MySQL BINARY(16) 或 CHAR(32),二進制節省 50% 空間
  2. 二進制協議傳輸:網絡協議/消息隊列中攜帶 MD5 校驗
  3. 密碼哈希存儲:注意 現代項目應使用 password_hash() (bcrypt/argon2) 而非 MD5
  4. 文件完整性校驗:二進制格式便於嵌入文件頭/元數據

性能對比

<?php
$str = str_repeat('x', 10000);
$iterations = 10000;

$start = microtime(true);
for ($i = 0; $i < $iterations; $i++) md5($str);
echo "md5() 32位: " . (microtime(true) - $start) . "s\n";

$start = microtime(true);
for ($i = 0; $i < $iterations; $i++) md5($str, true);
echo "md5() 16位: " . (microtime(true) - $start) . "s\n";

$start = microtime(true);
for ($i = 0; $i < $iterations; $i++) md5_raw2hex(md5($str, true));
echo "轉換開銷: " . (microtime(true) - $start) . "s\n";
/*
md5() 32位: 0.012s
md5() 16位: 0.011s
轉換開銷: 0.003s (可忽略)
*/
?>

原生雙格式輸出性能幾乎無差,轉換開銷極低。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved