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

How can I efficiently compute the md5 sum of an iterable of bits in Python?

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

下面的代码使用 bitarray 对象执行此操作,但我将 bitarray 实例(似乎在幕后使用花哨的 C 东西)交给 md5,得到不确定的结果。那么 "right" 方法是什么?

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。我可以重现位数组的不确定性,但我假设它只是将两个不应该一起工作的东西一起使用的函数。

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

您可以通过查看 memoryview(bits)

来了解这一点

您可以通过用 0s

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