哈希吧,滾雪球學 Python 哈希表與可哈希對象

      網友投稿 916 2025-03-31

      橡皮擦,一個逗趣的互聯網高級網蟲,新的系列,讓我們一起 Be More Pythonic。

      滾雪球學 Python 第二輪

      已完成的文章清單

      十一、Python 哈希表與可哈希對象

      11.1 哈希表(散列表)

      11.2 可哈希與不可哈希

      11.3 Python hash() 函數

      11.4 hashlib 模塊

      11.5 這篇博客的總結

      已完成的文章清單

      滾雪球學 Python 第二輪開啟,進階之路,列表與元組那些事兒

      說完列表說字典,說完字典說集合,滾雪球學 Python

      關于 Python 中的字符串,我在補充兩點,滾雪球學 Python

      列表推導式與字典推導式,滾雪球學 Python

      滾雪球學 Python 之 lambda 表達式

      滾雪球學 Python 之內置函數:filter、map、reduce、zip、enumerate

      Python 中級知識之裝飾器,滾雪球學 Python

      滾雪球學 Python 之閉包操作,本系列第 8 篇文章

      滾雪球學 Python 之怎么玩轉時間和日期庫

      滾雪球學 Python 之作用域下的 global 和 nonlocal 關鍵字

      十一、Python 哈希表與可哈希對象

      11.1 哈希表(散列表)

      哈希是從 Hash 音譯過來的,哈希表(hashtable),也叫做散列表。

      哈希表是鍵值對的無序集合,其每個鍵都是唯一的,核心算法是通過索引去查找值,Python 中的字典符合哈希表結構,字典中每個鍵對應一個值,my_dict={"key1":"value1","key2":"value2"}。

      哈希是使用算法將任意大小的數據映射到固定長度輸出的過程,該輸出就是哈希值。

      哈希算法可以創建高性能的數據結構,該結構可以快速存儲和訪問大量數據,哈希值通過哈希函數計算。

      哈希函數,本質上是鍵到值的映射關系;

      哈希表本質上就是一個數組,存儲的是經過哈希函數運算之后得到的值;

      哈希值是唯一標識數據的固定長度的數值。

      這些都屬于概念層面的知識,初期了解即可,后面隨著應用會逐步掌握。

      11.2 可哈希與不可哈希

      這部分在 官方文檔 說的比較繞,簡單說一下的結論(也是大家共識的),一個對象(Python 中萬物皆對象)在生命周期內,保持不變,就是可哈希的(hashable)。

      還有一個更簡單的證明辦法,在 Python 中能插入 set 集合的元素是可哈希的,例如下述代碼:

      my_set = set() test = [1, 3.14, 'hello', (2, 3), {'key': 1}, [1, 2], {3,6}] my_set.add(test[0]) my_set.add(test[1]) my_set.add(test[2]) my_set.add(test[3]) # my_set.add(test[4]) # my_set.add(test[5]) # my_set.add(test[6])

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      測試之后得到的結論是:

      可以被哈希的數據結構:int、float、str、tuple;

      不可以被哈希的數據結構:dict、list、set。

      加上之前滾雪球學到的知識,可以了解到,可以被哈希的數據類型都是不可變的,而不可以被哈希的數據類型是可變的,有點繞,稍微停頓一下,多讀兩遍即可。

      可哈希的對象通常用作字典的鍵和集合的成員,因為這些數據結構在內部使用哈希值。

      最終結論: 可哈希 ≈ 不可變。

      11.3 Python hash() 函數

      hash 函數用于獲取一個對象的哈希值,語法結果為 hash(object),返回值是對象的哈希值, 哈希值是整數。

      使用方式非常簡單:

      print(hash('test')) print(hash(1)) # 注意下面使用不可哈希對象會出現錯誤 # hash([1,2,3])

      1

      2

      3

      4

      11.4 hashlib 模塊

      hashlib 提供了常見的摘要算法,具體如下:

      md5()、sha1()、sha224()、sha256()、sha384()、sha512()、blake2b()、blake2s()、sha3_224()、sha3_256()、sha3_384()、 sha3_512()、 shake_128()、shake_256()

      使用 dir(hashlib) 即可獲取上述所有可用方法。

      MD5 是最常見的摘要算法,生成結果是固定的 16 字節,通常用一個 32 位的 16 進制字符串表示,示例代碼如下:

      import hashlib # MD5算法 md5 = hashlib.md5() data = "hello world" md5.update(data.encode('utf-8')) # 計算 hash 值,拿到加密字符串 print(md5.hexdigest())

      1

      2

      3

      4

      5

      6

      7

      SHA1 算法更安全,它的結果是 20 字節長度,通常用一個 40 位的 16 進制字符串表示。而比 SHA1 更安全的算法是 SHA256 和 SHA512 等,不過越安全的算法越慢,并且摘要長度更長。

      11.5 這篇博客的總結

      本篇博客為大家說明了 Python 的哈希表概念和可哈希對象,對于初學階段是有幫助的。

      深入研究下去,你應該嘗試自己手寫哈希算法與可哈希對象,再學習一段時間吧,希望本文對你有所幫助。

      相關閱讀

      Python 爬蟲 100 例教程,超棒的爬蟲教程,立即訂閱吧

      Python 爬蟲小課,精彩 9 講

      今天是持續寫作的第

      108

      / 200 天。

      如果你想跟博主建立親密關系,可以關注同名公眾號

      夢想橡皮擦

      哈希吧,滾雪球學 Python 哈希表與可哈希對象

      ,近距離接觸一個逗趣的互聯網高級網蟲。

      博主 ID:夢想橡皮擦,希望大家

      評論

      Python 數據結構

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Vue進階(十):用NPM來管理你的node.js依賴
      下一篇:Excle中如何打印表格?
      相關文章
      久久久久国产成人精品亚洲午夜 | 国产成人精品亚洲2020| 亚洲精品无码久久久久sm| 久久久久亚洲AV成人网人人网站 | 亚洲精品国产啊女成拍色拍| 亚洲男人的天堂在线播放| 久久精品国产99精品国产亚洲性色| 伊人久久大香线蕉亚洲| 亚洲精品无码专区久久久| 精品国产亚洲一区二区三区| 亚洲va久久久噜噜噜久久男同| 国产精品国产亚洲精品看不卡| 国产亚洲一区二区三区在线观看| 亚洲AV无码一区二区乱子伦| 亚洲国产精品VA在线看黑人| 亚洲va久久久噜噜噜久久天堂 | 亚洲国产一区二区三区青草影视| 亚洲伊人tv综合网色| 久久久久亚洲av无码专区喷水| 久久精品国产亚洲av麻| 久久亚洲AV无码精品色午夜麻豆 | 国产精品久久久久久亚洲小说| 老牛精品亚洲成av人片| 亚洲 无码 在线 专区| 亚洲男人第一无码aⅴ网站| 亚洲精品无码激情AV| 国产亚洲人成A在线V网站| 亚洲精品无码Av人在线观看国产 | 亚洲色图国产精品| 亚洲福利视频一区二区三区| 亚洲另类古典武侠| 亚洲人成电影网站色www| 国产亚洲精品AAAA片APP| 亚洲精品线路一在线观看| 亚洲伊人色欲综合网| 亚洲精品人成在线观看| 亚洲国产精品乱码在线观看97| 亚洲 欧洲 视频 伦小说| 国产精品亚洲一区二区在线观看 | 亚洲精品人成无码中文毛片 | 国产精品亚洲精品日韩已满|