请考虑以下代码。它将图像转换为艺术线条,然后计算比特的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非确定性,但我认为它只是一起使用两个不能一起工作的东西。
答案 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()