1. 程式人生 > >可變、不可變數據類型和hash

可變、不可變數據類型和hash

log operator token 通過 hash函數 ascii碼 和集 壓縮 沒有

一、可變和不可變數據類型

  在python中,我們對數據類型除了分為數字類型、字符串類型、列表類型、元組類型、字典類型和集合類型外,

還有另外一種分類方式,我們給數據類型分為可變數據類型和不可變數據類型。

  可變數據類型:列表、字典。

  不可變數據類型:數字、字符串、元組。

二、hash 

什麽是hash呢?

   Hash一般譯為“散列”,也音譯為“哈希”,就是把任意長度的輸入,通過散列算法,變換成固定長度的輸出,輸出的就是散列值。
 這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值
來唯一確定輸入值。簡單說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。

可使用的對象包括: 數字 、字符串、元組,不可使用hash函數的是 列表、字典。

hash的特征:hash值的計算過程是以依據這個值的特征計算的,這要求被hash的值必須固定,因此被hash的值必須不可變

用途: 文件簽名 、 md5加密 、 密碼驗證

  

  我們都知道數據是存儲在內存裏的,內存中的每一個位置都有自己的地址標示。當我們存儲了上百萬的人名的數據,當我們查找的時候將是一個

漫長的過程,假如我們能夠將這些人名轉換成,數字直接存儲在數字代表的內存地址中,等要找這個人的時候,直接去這個地址找人是不是就方便了? 

  例如:    

  假如對上述的聯系人信息進行存儲時,采用的Hash函數為:姓名的每個字的拼音開頭大寫字母的ASCII碼之和。因此
  address(張三)=ASCII(Z)+ASCII(S)=90+83=173;   address(李四)=ASCII(L)+ASCII(S)=76+83=159;   address(王老五)=ASCII(W)+ASCII(L)+ASCII(W)=87+76+87=250;

 但具體的情況比這個要復雜很多,還有很多復雜的因素都沒有考慮進入,比如如果計算出來的hash值發生了沖突怎麽辦?還有現在這張圖就可以看出空間上的浪費,
這就需要我們在設計hash算法的時候不能像我剛剛假設的那樣隨意。但這已經足以向你說明hash算法的與眾不同,它能為你在數據查找的過程中節省很多時間。
  然而好消息是,我們不需要關心hash值是如何計算的,因為python已經為我們設計了一套算法你只要拿來用就可以,如下:
n = 3
name = congocong
print(hash(name),hash(n))
name = cc
names = (cc,1,2,3)
print(hash(name),hash(names))

‘‘‘
hash針對列表時會出錯,因為列表可變
names = [4,5,6,(‘sc‘,21)]
print(hash(names))
‘‘‘





可變、不可變數據類型和hash