天天看點

PHP md5函數 的16位字元亂碼問題解決亂碼解決

亂碼

PHP的md5函數用于對字元串參數進行md5運算,該函數有兩個參數:

md5 ( string $str [, bool $raw_output = FALSE ] ) : string

第一個參數是輸入字元串;第二個參數預設為FALSE,設定為TRUE時可以輸出16位的md5值。

預設情況下,

md5(string $str)

會傳回:32 字元、十六進制數字形式的散列值。

如果加上第二個參數

md5(string $str,TRUE)

則傳回:16位元組長度的原始二進制格式的散列值。

由此我們看出,當傳回16位元組長度(對應16個字元,因為符合ASCII)的二進制格式時,由于浏覽器對其進行了字元化處理,由此就會産生亂碼:

$str = "PHP";
echo "字元串:".$str."<br>";
echo "TRUE - 原始 16 字元二進制格式:".md5($str,TRUE)."<br>";
echo "FALSE - 32 字元十六進制格式:".md5($str)."<br>";           
PHP md5函數 的16位字元亂碼問題解決亂碼解決

解決

那麼如何得到不亂碼的16位md5值呢?有兩種方法:

  1. 對輸出的16位元組的二進制轉化為十六進制;
  2. md5的密文中,16位密文與32位密文的第8-24位子字元串是一樣的,是以我們就可以通過截取的方式:

    substr(md5($str),8,16)

    來獲得16個字元的md5密文了。其中第二個參數和第三個參數代表從第8個字元開始(下标從0開始),取16個字元。

這裡我們用第二個方法來解決亂碼問題。還是以上面的例子:

$str = "PHP";
echo "字元串:".$str."<br>";
echo "TRUE - 原始 16 字元二進制格式(亂碼):".md5($str,TRUE)."<br>";
echo "TRUE - 原始 16 字元二進制格式(不亂碼):".substr(md5($str),8,16)."<br>";
echo "FALSE - 32 字元十六進制格式:".md5($str)."<br>";           
PHP md5函數 的16位字元亂碼問題解決亂碼解決

備注:而如果需要大寫的md5值,直接使用strtoupper(…)函數即可。

作者:doctorrm

連結:

PHP md5函數 的16位字元亂碼問題解決 來源: 程式設計日志 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。