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