Hash 函數將任意長度輸入映射為固定長度輸出,是數據完整性校驗、密碼存儲、緩存鍵生成的基石。本文展示一個極簡的 PHP 自定義 Hash 算法,解析其原理,並說明為何不可用於安全加密場景。
<?php
function SimpleHash($str) {
$n = 0;
// 遍歷字符串每個字符,累加 ASCII 碼值
for ($c = 0; $c < strlen($str); $c++) {
$n += ord($str[$c]);
}
// 返回整數摘要
return $n;
}
// 測試
$TestString = 'www.jb51.net';
echo SimpleHash($TestString); // 輸出: 1082
?>
ord() 獲取字符 ASCII 碼,累加至整數變量 $n。本質上是一個加權和校驗和,屬於最基礎的非加密 Hash。
| 特性 | 表現 |
|---|---|
| 確定性 | 相同輸入必得相同輸出 |
| 單向性 | 無法從輸出反推輸入(信息丟失) |
| 衝突極高 | 異序字符串(如 "ab" 和 "ba")產生相同值 |
| 分佈不均 | 輸出範圍受字符串長度限制,非均勻分佈 |
| 無雪崩效應 | 輸入微小變化導致輸出微小變化 |
| 極易逆向 | 已知輸出可構造無限多碰撞輸入 |
password_hash()/bcrypt/Argon2)<?php
// 1. 密碼哈希(PHP 5.5+)
$hash = password_hash('my_password', PASSWORD_DEFAULT);
if (password_verify('my_password', $hash)) { /* 通過 */ }
// 2. 數據完整性
$checksum = hash('crc32b', $data); // 快速、非加密
$digest = hash('sha256', $data); // 加密級
// 3. HMAC(帶密鑰驗證)
$hmac = hash_hmac('sha256', $data, $secret_key);
// 4. 一致性 Hash(分佈式)
// 採用成熟庫:amphp/consistent-hash, flexihash/flexihash
?>
理解簡易 Hash 原理有助於掌握雜湊函數核心思想,但實際開發中嚴禁自行實現加密算法。請始終使用經過密碼學專家審計、標準庫提供的成熟函數,並關注 PHP 版本更新帶來的安全增強(如 PHP 7.2+ 強制引入 Libsodium)。