python新手小例——文件哈希

碰到一個python小例程的網(wǎng)站(也有相關(guān)的python教程),隨便找了兩個例程翻譯了下,標(biāo)題為英文原文鏈接。

為了理解下面的內(nèi)容,你需要如下的python編程基礎(chǔ)知識:


得到文件的哈希值

哈希函數(shù)(又稱散列函數(shù))接受任意數(shù)量的數(shù)據(jù)并返回固定長度的位串。函數(shù)的輸出稱為摘要消息(digest message)。
它們廣泛地用于加密認(rèn)證信息。有許多散列函數(shù),如MD5,SHA-1等。參考此頁面了解更多關(guān)于加密散列函數(shù)
在這個例子中,我們將演示如何哈希文件。我們將使用SHA-1散列算法。 SHA-1產(chǎn)生的摘要是160位長。
我們不會一次性提取全部文件數(shù)據(jù),因?yàn)橐恍┪募浅4?,會很消耗?nèi)存甚至一次性放不下。將文件分割成小塊讀取將使處理過程高效地使用內(nèi)存。

代碼-獲取散列值
# Python程序-獲取一個文件的SHA-1摘要信息

# 引入hashlib模塊
import hashlib

def hash_file(filename):
   """該函數(shù)返回傳入文件的SHA-1哈希值"""

   # 創(chuàng)建一個哈希對象
   h = hashlib.sha1()

   # 以二進(jìn)制讀取模式打開一個文件
   with open(filename,'rb') as file:

       # 循環(huán)直到文件結(jié)束
       chunk = 0
       while chunk != b'':
           # read only 1024 bytes at a time
           chunk = file.read(1024)
           h.update(chunk)

   # 返回摘要的十六進(jìn)制表示
   return h.hexdigest()

message = hash_file("1.gif")
print(message)
輸出
47d53886c16766d41ce4094cba433e91dc853d57

在這個程序中,我們從hashlib模塊中獲取哈希函數(shù),以二進(jìn)制模式打開文件。我們使用while循環(huán)讀取直到文件結(jié)束——文件結(jié)束時,我們讀取到空字節(jié)對象。
在每次迭代中,我們只從文件中讀取1024字節(jié)(這個值可以根據(jù)我們的愿望改變),并更新散列函數(shù)。
最后,我們使用hexdigest()方法返回十六進(jìn)制表示的摘要消息。


得到圖像的大?。ǚ直媛剩?/a>

實(shí)際上使用Pillow庫可以方便地獲得圖像信息,而且這個例程還有些問題,圖像的長寬字節(jié)的所在位置并不是固定的,而是有另一套規(guī)則,不過也可以用來學(xué)習(xí)下文件和位操作。


JPEG(Joint Photographic Experts Group)是圖像壓縮中使用最廣泛的壓縮技術(shù)之一。
大多數(shù)文件格式具有 包含關(guān)于文件的有用信息的 標(biāo)頭(最初幾個字節(jié))。
例如,jpeg文件頭包含高度,寬度,顏色數(shù)量(灰度或RGB)等信息。在這個程序中,我們不使用任何外部庫,通過讀取jpeg文件頭來獲取該圖片的分辨率。

代碼-獲取圖片分辨率
 def jpeg_res(filename):
   """該函數(shù)打印出傳入圖片的分辨率"""

   # 以二進(jìn)制讀取模式打開圖片
   with open(filename,'rb') as img_file:

       # 圖片高度 (2個字節(jié)) 在第164位
       img_file.seek(163)

       # 讀取兩個字節(jié)
       a = img_file.read(2)

       # 計(jì)算高度
       height = (a[0] << 8) + a[1]

       # 之后兩個字節(jié)為寬度
       a = img_file.read(2)

       # 計(jì)算寬度
       width = (a[0] << 8) + a[1]

   print("The resolution of the image is",width,"x",height)

jpeg_res("img1.jpg")
輸出
The resolution of the image is 280 x 280

在這個程序中,我們以二進(jìn)制模式打開圖像。非文本文件必須在此模式下打開。圖像的高度位于第164位,緊跟著的是圖像的寬度。兩者都是2字節(jié)長。
注意,這僅適用于JPEG文件交換格式(JFIF)標(biāo)準(zhǔn)。如果你的圖像是使用其他標(biāo)準(zhǔn)(如EXIF)編碼,代碼將失效。
我們使用按位移位算符<<將2個字節(jié)轉(zhuǎn)換為一個數(shù)字(將頭一個字節(jié)左移8位再加上第二個字節(jié))。最后,顯示分辨率。

相關(guān)鏈接
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容