2017-05-22 2 views
2

압축 해제하지 않고 zip 파일의 내용에 대한 CRC32, MD5 및 SHA1을 계산해야합니다.파이썬에서 압축 해제없이 zip 콘텐츠의 CRC32, MD5 및 SHA1을 계산하십시오.

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 파일의 내용에 대해서는 계산할 필요없이 직접 zip 파일에서 CRC32를 읽을 수 있습니다. 그것은 다음과 같은 : 우편 내용의

읽기 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')) 

하지만 먼저 압축을 해제하지 않고 압축 파일의 내용의 SHA1 (또는 MD5)를 계산하는 방법을 알아낼 수 없었다. 그게 가능할까요?

답변

2

불가능합니다. 아카이브가 생성 될 때 (무결성 검사에 사용됨)주의 깊게 사전 계산되어 있기 때문에 CRC를 얻을 수 있습니다. 다른 체크섬/해시는 처음부터 계산되어야하며 아카이브 내용의 스트리밍, 즉 압축을 풀어야합니다.

UPD : Possibble 구현

libarchive : 종속되지 응답 만

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

덕분에 우편 번호 : 추가 종속성, 많은 아카이브 형식

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

을 지원합니다. 그 일을하는 가장 메모리 효율적인 방법은 무엇입니까? – paradadf

+1

@paradadf가 답변을 업데이트했습니다. – Marat

관련 문제