【发布时间】:2015-01-29 11:43:26
【问题描述】:
我正在尝试使用 python 模块 gzip 压缩文件,然后使用 hashlib 对 gzip 文件进行哈希处理。我有以下代码:
import hashlib
import gzip
f_name = 'read_x.fastq'
for x in range(0,3):
file = open(f_name, 'rb')
myzip = gzip.open('test.gz', 'wb', compresslevel=1)
n = 100000000
try:
print 'zipping ' + str(x)
for chunk in iter(lambda: file.read(n), ''):
myzip.write(chunk)
finally:
file.close()
myzip.close()
md5 = hashlib.md5()
print 'hashing ' + str(x)
with open('test.gz', 'r') as f:
for chunk in iter(lambda: f.read(n), ''):
md5.update(chunk)
print md5.hexdigest()
print '\n'
我认为应该简单地压缩文件,对其进行哈希处理并连续三次显示相同的输出哈希值。但是,我得到的输出是:
zipping 0
hashing 0
7bd80798bce074c65928e0cf9d66cae4
zipping 1
hashing 1
a3bd4e126e0a156c5d86df75baffc294
zipping 2
hashing 2
85812a39f388c388cb25a35c4fac87bf
如果我省略 gzip 步骤,并且连续 3 次对同一个 gzip 文件进行哈希处理,我确实会得到相同的输出 3 次:
hashing 0
ccfddd10c8fd1140db0b218124e7e9d3
hashing 1
ccfddd10c8fd1140db0b218124e7e9d3
hashing 2
ccfddd10c8fd1140db0b218124e7e9d3
谁能解释这里发生了什么?问题一定是gzip过程每次都不一样。但据我所知,DEFLATE 算法是 Huffman 编码后跟 LZ77(一种行程编码形式)或 LZ77 后跟 Huffman,因此给定相同的输入应该产生相同的输出。
【问题讨论】: