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

2021-09-19 18:34:48 字數 1302 閱讀 4906

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)."

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

對輸出的16位元組的二進位制轉化為十六進製制;

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)."

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

16 字串比較函式

字串處理函式 strcmp s1,s2 可以比較兩個字串的大小,其字元的大小是以 ascii 碼表上的順序決定。該函式首先將 s1 第乙個字元值減去 s2 的第乙個字元值,若差值為 0 則繼續比較對應的下乙個字母,若不為 0 則該差值就是函式的最終結果。請按照該函式的實現原理,寫出乙個新的字串比較函...

GUID 字串,16位字串,19位數字

當我們想要獲得乙個唯一的key的時候,通常會想到guid。這個key非常的長,雖然我們在很多情況下這並不是個問題。但是當我們需要將這個36個字元的字串放在url中時,會使的url非常的醜陋。想要縮短guid的長度而不犧牲它的唯一性是不可能的,但是如果我們能夠接受乙個16位的字串的話是可以做出這個犧牲...

day5 字串 函式

字串 1.單引號,雙引號,三引號括起來的都是字串 索引 從0開始 str 0 遍歷 for迴圈 判斷字串中是否都是數字 字母 返回bool型 string.isdecimal string.isalpha 字串替換 缺省會全部替換 string.replace old,new,次數 字串查詢 str...