首頁  >  文章  >  後端開發  >  如何解決PHP md5函數的16位元字亂碼問題

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

藏色散人
藏色散人原創
2020-08-18 09:22:413861瀏覽

php md5 16位元字元亂碼的解決方法:1、對輸出的16位元組的二進位轉換為十六進位;2、透過“substr(md5($str),8,16)”方法來獲得16個字元的md5密文。

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

推薦:《PHP影片教學》 

亂碼

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."
"; echo "TRUE - 原始 16 字符二进制格式:".md5($str,TRUE)."
"; echo "FALSE - 32 字符十六进制格式:".md5($str)."
";

如何解決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."
"; echo "TRUE - 原始 16 字符二进制格式(乱码):".md5($str,TRUE)."
"; echo "TRUE - 原始 16 字符二进制格式(不乱码):".substr(md5($str),8,16)."
"; echo "FALSE - 32 字符十六进制格式:".md5($str)."
";

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

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

以上是如何解決PHP md5函數的16位元字亂碼問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn