2017-05-22 101 views
2

我需要計算zip文件內容的CRC32,MD5和SHA1而不解壓縮它們。在Python中無需解壓縮計算zip32內容的CRC32,MD5和SHA1

到目前爲止,我發現瞭如何計算這些對zip文件本身,如:

CRC32:

import zlib 


zip_name = "test.zip" 


def Crc32Hasher(file_path): 

    buf_size = 65536 
    crc32 = 0 

    with open(file_path, 'rb') as f: 
     while True: 
      data = f.read(buf_size) 
      if not data: 
       break 
      crc32 = zlib.crc32(data, crc32) 

    return format(crc32 & 0xFFFFFFFF, '08x') 


print(Crc32Hasher(zip_name)) 

SHA1:(MD5下同)

import hashlib 


zip_name = "test.zip" 


def Sha1Hasher(file_path): 

    buf_size = 65536 
    sha1 = hashlib.sha1() 

    with open(file_path, 'rb') as f: 
     while True: 
      data = f.read(buf_size) 
      if not data: 
       break 
      sha1.update(data) 

    return format(sha1.hexdigest()) 


print(Sha1Hasher(zip_name)) 

對於zip文件的內容,我可以直接從zip中讀取CRC32,而無需計算它如下:zip壓縮內容

讀CRC32:

import zipfile 

zip_name = "test.zip" 

if zip_name.lower().endswith(('.zip')): 
    z = zipfile.ZipFile(zip_name, "r") 

for info in z.infolist(): 

    print(info.filename, 
      format(info.CRC & 0xFFFFFFFF, '08x')) 

但我無法弄清楚如何計算的zip文件內容的SHA1(或MD5)不首先把它們解。 這是可能的嗎?

回答

2

這是不可能的。您可以獲得CRC,因爲在創建歸檔時已經仔細地爲您預先計算了CRC(它用於完整性檢查)。任何其他校驗和/散列必須從頭開始計算,並且至少需要流式存檔內容,即解包。

UPD:Possibble實現

libarchive:額外的依賴,支持多種壓縮格式

import libarchive.public as libarchive 
with libarchive.file_reader(fname) as archive: 
    for entry in archive: 
     md5 = hashlib.md5() 
     for block in entry.get_blocks(): 
      md5.update(block) 
     print(str(entry), md5.hexdigest()) 

本地zipfile:沒有依賴,只有

import zipfile 

archive = zipfile.ZipFile(fname) 
blocksize = 1024**2 #1M chunks 
for fname in archive.namelist(): 
    entry = archive.open(fname) 
    md5 = hashlib.md5() 
    while True: 
     block = entry.read(blocksize) 
     if not block: 
      break 
     md5.update(block) 
     print(fname, md5.hexdigest()) 
+0

謝謝回答拉鍊。什麼是最有效的內存方式呢? – paradadf

+1

@paradadf更新了答案 – Marat