如何有效地计算Python中可迭代位的md5总和?

时间:2015-08-03 01:00:54

标签: python hash md5 generator bitarray

请考虑以下代码。它将图像转换为艺术线条,然后计算比特的md5sum。我不知道比使用生成单个位的生成器表达式更好。但是,如何以有效的方式将结果提供给md5?

下面的代码使用bitarray对象进行处理,但是我得到了bitarray个实例(它们似乎使用了引人注目的C内容)到md5的非确定性结果。那么“正确”的做法是什么?

import os, hashlib
from PIL import Image
from bitarray import bitarray

def image_pixel_hash_code(image):
    pixels = list(image.getdata())
    avg = sum(pixels) / len(pixels)
    bits = bitarray(pixel < avg for pixel in pixels)
    return hashlib.md5(bits).hexdigest()


im = Image.open(os.path.expanduser("~/Downloads/test.jpg")).convert("L")
print image_pixel_hash_code(im)

P.S。我可以重现bitarray非确定性,但我认为它只是一起使用两个不能一起工作的东西。

1 个答案:

答案 0 :(得分:3)

如果bits的长度不是8的倍数,则散列在bits的末尾包含随机位。

您可以通过查看memoryview(bits)

来看到这一点

您可以通过使用bits s

填充0来解决此问题
    bits = bitarray(1 if pixel < avg else 0 for pixel in pixels)
    bits.fill()
    return hashlib.md5(bits).hexdigest()