- 1、php代碼hash解析
- 2、PHP中用hash實現的數組
- 3、php程序員 hash碰撞原理是什麼 怎麼解決
將給定的明文密碼通過加”鹽”(干擾碼)後,再經過哈希演算法的sha512演算法結果與哈希演算法whirlpool演算法的兩個值進行與運算,將結果返回。
舉例:(示例一下,例子未必形象)
假如你輸入一個密碼:123456
通過運算(自定義一個干擾碼 abcd@!#$)
1、hash(”abcd@!#$”,”123456″)
2、用hash演算法的sha512演算法對(abcd@!#$123456)進行加密取得值a
3、用hash演算法的whirlpool演算法對(abcd@!#$123456)進行加密取得值b
4、將a和b進行二進位位與運算得到c
5、將c轉化為十六進位數返回
通過該方法可以將用戶的輸入的明文進行加密,多用於用戶密碼的存儲和比較。說白了就是只有輸入的用戶知道密碼的明文,程序設計者、資料庫管理員、黑客就算拿到加密的密文也不會知道(短時間內)密碼的明文。
例外:如果黑客知道了使用的鹽(干擾碼)和演算法,當然可以自己創建一個新的彩虹表,通過高性能計算是有可能將明文碰撞出來的,當然你可以個直接找到用戶強迫他說出來~嘿嘿嘿~
PHP中使用最多的非Array莫屬了,那Array是如何實現的?在PHP內部Array通過一個hashtable來實現,其中使用鏈接法解決hash衝突的問題,這樣最壞情況下,查找Array元素的複雜度為O(N),最好則為1.
而其計算字元串hash值的方法如下,將源碼摘出來以供查備:
複製代碼
代碼如下:
static
inline
ulong
zend_inline_hash_func(const
char
*arKey,
uint
nKeyLength)
{
register
ulong
hash
=
5381;
//此處初始值的設置有什麼玄機么?
/*
variant
with
the
hash
unrolled
eight
times
*/
for
(;
nKeyLength
=
8;
nKeyLength
-=
8)
{
//這種step=8的方式是為何?
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
//比直接*33要快
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
}
switch
(nKeyLength)
{
case
7:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough…
*/
//此處是將剩餘的字元hash
case
6:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough…
*/
case
5:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough…
*/
case
4:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough…
*/
case
3:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough…
*/
case
2:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough…
*/
case
1:
hash
=
((hash
5)
+
hash)
+
*arKey++;
break;
case
0:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
return
hash;//返回hash值
}
ps:對於以下函數,仍有兩點不明:
hash
=
5381設置的理由?
這種step=8的循環方式是為了效率么?
hash函數相當於,把原空間的一個數據集映射到另外一個空間 或者可以理解為把一個原文通過hash函數編程另一個文本成為密文 這就是hash加密
比如md5 任何原文都會被加密成8位或者16位密文 8位16位密文是有窮的可以窮舉而原文長度不限所以理論上是無窮的 這就會出現兩個或多個不同的原文md5加密後會變成相同的密文 碰撞就是找出一個或多個加密後相同密文的原文
碰撞是存在的並不能完全解決我們只能讓碰撞的概率儘可能減小 那就是把映射的空間或者說加密的密文邊長 密文越長組合的方式越多發生碰撞的概率就越小
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/127310.html