最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python從入門到精通之Hash函數(shù)的使用詳解

 更新時(shí)間:2023年08月04日 09:03:16   作者:ziwu  
Python提供了強(qiáng)大而靈活的Hash函數(shù),用于在各種應(yīng)用中實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)校驗(yàn)、加密等功能,下面將從入門到精通介紹Python中Hash函數(shù)的使用,感興趣的可以了解一下

介紹

在計(jì)算機(jī)科學(xué)中,Hash函數(shù)(散列函數(shù))是一種將輸入數(shù)據(jù)映射到固定大小的散列值(哈希值)的函數(shù)。Python提供了強(qiáng)大而靈活的Hash函數(shù),用于在各種應(yīng)用中實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)校驗(yàn)、加密等功能。本文將從入門到精通介紹Python中Hash函數(shù)的使用。

1. 什么是Hash函數(shù)

Hash函數(shù)是一種將輸入(任意長(zhǎng)度)映射到固定大小(通常較?。┹敵龅乃惴?。輸出的固定長(zhǎng)度稱為哈希值。Hash函數(shù)有以下特性:

  • 對(duì)于相同的輸入,必須始終產(chǎn)生相同的哈希值。
  • 不同的輸入應(yīng)該具有不同的哈希值(盡可能避免沖突)。
  • 不可逆性:無(wú)法從哈希值推導(dǎo)出原始輸入數(shù)據(jù)。
  • 任意長(zhǎng)度的輸入應(yīng)該產(chǎn)生固定長(zhǎng)度的哈希值。

2. Python中的內(nèi)置Hash函數(shù)

Python內(nèi)置了一個(gè)hash()函數(shù),用于計(jì)算對(duì)象的哈希值。不同類型的對(duì)象(如整數(shù)、字符串、元組等)具有不同的哈希函數(shù)實(shí)現(xiàn)。

# 使用hash()函數(shù)計(jì)算哈希值
hash_value1 = hash(42)
hash_value2 = hash("Hello, Python!")
hash_value3 = hash((1, 2, 3))
print(f"Hash value of 42: {hash_value1}")
print(f"Hash value of 'Hello, Python!': {hash_value2}")
print(f"Hash value of (1, 2, 3): {hash_value3}")

3. 常見(jiàn)的Hash算法

Python中常見(jiàn)的Hash算法包括MD5(Message Digest Algorithm 5)、SHA-1(Secure Hash Algorithm 1)和SHA-256等。這些算法被廣泛用于數(shù)據(jù)校驗(yàn)、數(shù)據(jù)完整性驗(yàn)證和密碼學(xué)中。 首先,我們需要導(dǎo)入Python的hashlib模塊:

import hashlib

3.1 使用MD5算法計(jì)算Hash值

MD5算法會(huì)將任意長(zhǎng)度的輸入轉(zhuǎn)換為128位的哈希值。然而,由于MD5的安全性較差,不再推薦在安全敏感的場(chǎng)景中使用。

data = "Hello, MD5!"
# 創(chuàng)建MD5對(duì)象
md5_obj = hashlib.md5()
# 更新哈希對(duì)象以使用字符串
md5_obj.update(data.encode())
# 獲取MD5哈希值
md5_hash = md5_obj.hexdigest()
print(f"MD5 Hash of '{data}': {md5_hash}")

3.2 使用SHA-256算法計(jì)算Hash值

SHA-256算法會(huì)將任意長(zhǎng)度的輸入轉(zhuǎn)換為256位的哈希值,提供了更高的安全性,因此更適合用于數(shù)據(jù)校驗(yàn)和加密。

data = "Hello, SHA-256!"
# 創(chuàng)建SHA-256對(duì)象
sha256_obj = hashlib.sha256()
# 更新哈希對(duì)象以使用字符串
sha256_obj.update(data.encode())
# 獲取SHA-256哈希值
sha256_hash = sha256_obj.hexdigest()
print(f"SHA-256 Hash of '{data}': {sha256_hash}")

4. Hash在數(shù)據(jù)結(jié)構(gòu)中的應(yīng)用

在數(shù)據(jù)結(jié)構(gòu)中,Hash函數(shù)常用于實(shí)現(xiàn)Hash表(散列表)。Hash表是一種用于存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),它能夠在常數(shù)時(shí)間復(fù)雜度內(nèi)執(zhí)行插入、查找和刪除操作。 Python中,我們可以使用字典(Dictionary)來(lái)實(shí)現(xiàn)Hash表。字典是一種無(wú)序的鍵值對(duì)集合,鍵必須是可哈希的數(shù)據(jù)類型。

# 創(chuàng)建一個(gè)字典
person = {
    "name": "John Doe",
    "age": 30,
    "email": "john@example.com"
}
# 添加新的鍵值對(duì)
person["city"] = "New York"
# 獲取鍵對(duì)應(yīng)的值
print("Name:", person["name"])
print("Age:", person["age"])
print("Email:", person["email"])
print("City:", person.get("city", "City not found"))
# 刪除鍵值對(duì)
del person["email"]
# 檢查鍵是否存在
if "email" in person:
    print("Email found.")
else:
    print("Email not found.")

5. 使用Hash進(jìn)行數(shù)據(jù)校驗(yàn)

Hash函數(shù)常用于數(shù)據(jù)完整性驗(yàn)證,即確認(rèn)數(shù)據(jù)在傳輸或存儲(chǔ)過(guò)程中是否被篡改。在這種應(yīng)用中,我們先計(jì)算原始數(shù)據(jù)的哈希值,然后將其與接收到的數(shù)據(jù)的哈希值進(jìn)行比較。

import hashlib
def calculate_hash(data):
    # 創(chuàng)建SHA-256對(duì)象
    sha256_obj = hashlib.sha256()
    # 更新哈希對(duì)象以使用數(shù)據(jù)
    sha256_obj.update(data)
    # 獲取SHA-256哈希值
    return sha256_obj.digest()
    # 原始數(shù)據(jù)
original_data = b"Hello, Hash!"
# 計(jì)算原始數(shù)據(jù)的哈希值
original_hash = calculate_hash(original_data)
# 模擬數(shù)據(jù)傳輸或存儲(chǔ)過(guò)程中數(shù)據(jù)被篡改
tampered_data = b"Hello, Tampered Hash!"
# 計(jì)算篡改后數(shù)據(jù)的哈希值
tampered_hash = calculate_hash(tampered_data)
# 對(duì)比哈希值
if original_hash == tampered_hash:
    print("Data integrity verified: Data is unchanged.")
else:
    print("Data integrity compromised: Data has been tampered with.")

6. 安全性和沖突

Hash函數(shù)的安全性是指對(duì)于給定的哈希值,很難找到與之對(duì)應(yīng)的原始輸入數(shù)據(jù)。如果不同的輸入數(shù)據(jù)產(chǎn)生了相同的哈希值,就稱為哈希沖突。 通常情況下,Hash算法都被設(shè)計(jì)為抵抗預(yù)像攻擊(Preimage Attack)和第二像攻擊(Second Preimage Attack),即找到原始數(shù)據(jù)或找到與給定哈希值相同的其他數(shù)據(jù)。 然而,完全避免哈希沖突是不可能的。好的Hash算法應(yīng)該使沖突發(fā)生的概率盡可能小。

7. Hash表的實(shí)現(xiàn)

在前面的例子中,我們已經(jīng)使用Python的字典來(lái)演示了Hash表的功能。現(xiàn)在,我們來(lái)簡(jiǎn)單了解一下Hash表的實(shí)現(xiàn)原理。 Hash表的基本思想是通過(guò)Hash函數(shù)將鍵映射為索引,然后將鍵值對(duì)存儲(chǔ)在對(duì)應(yīng)索引的位置上。當(dāng)我們需要訪問(wèn)某個(gè)鍵的值時(shí),使用Hash函數(shù)找到對(duì)應(yīng)的索引,從而快速獲取值。 Python的字典實(shí)現(xiàn)了Hash表的所有功能,它使用了開(kāi)放定址法解決哈希沖突,并且根據(jù)需要?jiǎng)討B(tài)調(diào)整表的大小以保持性能。

8. 哈希集合和哈希映射

在Python中,除了字典(哈希映射),還有集合(哈希集合)這一數(shù)據(jù)類型。集合是一組無(wú)序且唯一的元素的集合。

# 創(chuàng)建一個(gè)哈希集合
fruits = {"apple", "banana", "orange", "apple", "grape"}
print("Fruits:", fruits)  # 輸出:{'orange', 'banana', 'grape', 'apple'}

哈希集合的底層實(shí)現(xiàn)與哈希映射類似,只不過(guò)哈希集合只存儲(chǔ)鍵而沒(méi)有對(duì)應(yīng)的值。

9. 使用Hash進(jìn)行加密

除了數(shù)據(jù)校驗(yàn),Hash函數(shù)還廣泛應(yīng)用于密碼學(xué)中的密碼哈希。在存儲(chǔ)用戶密碼時(shí),我們通常不會(huì)直接存儲(chǔ)原始密碼,而是將其計(jì)算哈希值后存儲(chǔ)。這樣即使數(shù)據(jù)庫(kù)泄漏,攻擊者也無(wú)法輕易獲取用戶的真實(shí)密碼。

import hashlib
def hash_password(password):
    # 創(chuàng)建SHA-256對(duì)象
    sha256_obj = hashlib.sha256()
    # 更新哈希對(duì)象以使用密碼
    sha256_obj.update(password.encode())
    # 獲取SHA-256哈希值
    return sha256_obj.hexdigest()
    # 用戶注冊(cè)時(shí)設(shè)置密碼
user_password = "my_secret_password"
hashed_password = hash_password(user_password)
# 模擬登錄驗(yàn)證
input_password = input("Enter your password: ")
input_hashed_password = hash_password(input_password)
if input_hashed_password == hashed_password:
    print("Login successful.")
else:
    print("Invalid password. Please try again.")

10.如何通過(guò)hash判斷用戶上傳的文本文件是否重復(fù)

通過(guò)Hash來(lái)判斷用戶上傳的文本文件是否重復(fù),可以利用Hash值的唯一性特性。當(dāng)用戶上傳一個(gè)文本文件時(shí),我們首先計(jì)算該文件的Hash值,并將該Hash值與之前上傳文件的Hash值進(jìn)行對(duì)比。如果兩個(gè)文件的Hash值相同,那么這兩個(gè)文件很有可能是相同的,即重復(fù)上傳。 以下是一個(gè)簡(jiǎn)單的Python示例代碼來(lái)實(shí)現(xiàn)這個(gè)功能:

import hashlib
def calculate_file_hash(file_path):
    # 創(chuàng)建SHA-256對(duì)象
    sha256_obj = hashlib.sha256()
    # 以二進(jìn)制方式讀取文件內(nèi)容,避免文本編碼問(wèn)題
    with open(file_path, "rb") as file:
        while chunk := file.read(8192):  # 每次讀取8KB數(shù)據(jù)
            sha256_obj.update(chunk)
            # 獲取文件的SHA-256哈希值
    return sha256_obj.hexdigest()
def is_file_duplicate(file_path, known_hashes):
    file_hash = calculate_file_hash(file_path)
    return file_hash in known_hashes
    # 已知的Hash值集合,用于存儲(chǔ)之前上傳文件的Hash值
known_hashes = set()
# 假設(shè)用戶上傳了兩個(gè)文本文件
file1_path = "path/to/uploaded_file1.txt"
file2_path = "path/to/uploaded_file2.txt"
# 檢查文件1是否重復(fù)
if is_file_duplicate(file1_path, known_hashes):
    print("File 1 is a duplicate.")
else:
    print("File 1 is unique.")
    known_hashes.add(calculate_file_hash(file1_path))
    # 檢查文件2是否重復(fù)
if is_file_duplicate(file2_path, known_hashes):
    print("File 2 is a duplicate.")
else:
    print("File 2 is unique.")
    known_hashes.add(calculate_file_hash(file2_path))

在上面的代碼中,calculate_file_hash()函數(shù)用于計(jì)算文件的SHA-256哈希值。is_file_duplicate()函數(shù)用于判斷文件是否重復(fù),它會(huì)將文件的Hash值與之前已知的Hash值集合進(jìn)行對(duì)比。 請(qǐng)注意,如果用戶上傳大量文件,已知的Hash值集合可能會(huì)變得非常大。在實(shí)際應(yīng)用中,你可能需要將已知的Hash值存儲(chǔ)在數(shù)據(jù)庫(kù)中,以便更高效地進(jìn)行查找和比較。

結(jié)論

Python的Hash函數(shù)提供了廣泛的應(yīng)用,從數(shù)據(jù)結(jié)構(gòu)到數(shù)據(jù)校驗(yàn)、密碼學(xué)等領(lǐng)域都有重要作用。了解和熟練掌握Hash函數(shù)的使用,對(duì)于每個(gè)Python開(kāi)發(fā)工程師來(lái)說(shuō)都是必備的技能。無(wú)論你是在構(gòu)建數(shù)據(jù)結(jié)構(gòu),進(jìn)行數(shù)據(jù)校驗(yàn),還是在處理密碼和加密方面,Hash函數(shù)都能幫助你實(shí)現(xiàn)高效、安全的解決方案。

到此這篇關(guān)于Python從入門到精通之Hash函數(shù)的使用詳解的文章就介紹到這了,更多相關(guān)Python Hash內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python 抽象類的使用詳解

    python 抽象類的使用詳解

    這篇文章主要介紹了python 抽象類的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • python實(shí)現(xiàn)圖片文件批量重命名

    python實(shí)現(xiàn)圖片文件批量重命名

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖片文件批量重命名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • python實(shí)現(xiàn)簡(jiǎn)易自習(xí)室座位預(yù)約系統(tǒng)

    python實(shí)現(xiàn)簡(jiǎn)易自習(xí)室座位預(yù)約系統(tǒng)

    本文將結(jié)合實(shí)例代碼,介紹python實(shí)現(xiàn)簡(jiǎn)易自習(xí)室座位預(yù)約系統(tǒng),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 使用Python Turtle繪制炫酷幾何圖案的簡(jiǎn)單代碼

    使用Python Turtle繪制炫酷幾何圖案的簡(jiǎn)單代碼

    在編程的世界里,圖形化編程是一種非常有趣且直觀的方式,Python 的 turtle 模塊就是這樣一個(gè)工具,它通過(guò)一個(gè)虛擬的“海龜”在屏幕上移動(dòng)來(lái)繪制各種圖形,今天,我們將利用 turtle 模塊,探索如何使用簡(jiǎn)單的代碼繪制出令人驚嘆的幾何圖案,需要的朋友可以參考下
    2025-04-04
  • Pytorch矩陣乘法(torch.mul() 、 torch.mm() 和torch.matmul()的區(qū)別)

    Pytorch矩陣乘法(torch.mul() 、 torch.mm() 和torch.m

    在深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的世界里,矩陣乘法是一項(xiàng)至關(guān)重要的操作,本文主要介紹了Pytorch矩陣乘法,包含了torch.mul() 、 torch.mm() 和torch.matmul()的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Python 反轉(zhuǎn)字符串(reverse)的方法小結(jié)

    Python 反轉(zhuǎn)字符串(reverse)的方法小結(jié)

    這篇文章主要介紹了Python 反轉(zhuǎn)字符串(reverse)的方法小結(jié),需要的朋友可以參考下
    2018-02-02
  • Python制作簡(jiǎn)易版2048小游戲

    Python制作簡(jiǎn)易版2048小游戲

    2048作為經(jīng)典的手機(jī)端游戲一直深受大家的喜愛(ài),本文將利用Python中的Pygame模塊制作簡(jiǎn)單版的2048游戲,感興趣的小伙伴可以了解一下
    2022-07-07
  • Python斷言assert的用法代碼解析

    Python斷言assert的用法代碼解析

    這篇文章主要介紹了Python斷言assert的用法代碼解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Python實(shí)現(xiàn)解析與生成JSON數(shù)據(jù)

    Python實(shí)現(xiàn)解析與生成JSON數(shù)據(jù)

    JSON文件是一種輕量級(jí)的數(shù)據(jù)交換格式,它采用了一種類似于JavaScript語(yǔ)法的結(jié)構(gòu),可以方便地在不同平臺(tái)和編程語(yǔ)言之間進(jìn)行數(shù)據(jù)交換,下面我們就來(lái)學(xué)習(xí)一下Python如何使用內(nèi)置的json模塊來(lái)讀取和寫入JSON文件吧
    2023-12-12
  • 通過(guò)python實(shí)現(xiàn)彈窗廣告攔截過(guò)程詳解

    通過(guò)python實(shí)現(xiàn)彈窗廣告攔截過(guò)程詳解

    這篇文章主要介紹了通過(guò)python實(shí)現(xiàn)彈窗廣告攔截過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07

最新評(píng)論

高邮市| 横山县| 庄河市| 彩票| 天等县| 施秉县| 武威市| 松潘县| 成安县| 滦南县| 易门县| 潮安县| 湖州市| 靖江市| 策勒县| 柘城县| 尤溪县| 宁乡县| 和平区| 定结县| 当阳市| 巴林右旗| 射阳县| 仪陇县| 平度市| 达拉特旗| 射洪县| 扎鲁特旗| 汨罗市| 湟中县| 饶阳县| 五指山市| 天镇县| 肥城市| 山东| 嘉禾县| 桑日县| 涞源县| 郑州市| 淅川县| 江门市|