考虑下面的代码。它将图像转换为艺术线条,然后计算这些位的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)


附言我可以重现位数组的不确定性,但我假设这只是一起使用两个不应该一起工作的功能。

最佳答案

如果bits的长度不是8的倍数,则哈希将在bits的末尾包括随机位。

您可以通过查看memoryview(bits)来查看

您可以通过用bits填充0来解决此问题

    bits = bitarray(1 if pixel < avg else 0 for pixel in pixels)
    bits.fill()
    return hashlib.md5(bits).hexdigest()

关于python - 如何有效地计算Python中可迭代位的md5和?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31778110/

10-14 07:51