php中使用hash(PHP中使用函數返回值完成兩個數的加減乘除)

  • 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-hant/n/127310.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-10-03 23:13
下一篇 2024-10-03 23:15

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python庫開發:加減乘除

    本文將介紹如何使用Python編寫一個庫,其中包含基本的數學運算:加、減、乘、除。 一、庫的構建和實現 Python庫可以包括多個模塊,每個模塊都對應一個.py文件,其中包括了需要…

    編程 2025-04-29

發表回復

登錄後才能評論