如何有效计算 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)
来了解这一点
您可以通过用 0
s
填充 bits
来解决这个问题
bits = bitarray(1 if pixel < avg else 0 for pixel in pixels)
bits.fill()
return hashlib.md5(bits).hexdigest()
考虑下面的代码。它将图像转换为艺术线条,然后计算位的 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)
您可以通过用 0
s
bits
来解决这个问题
bits = bitarray(1 if pixel < avg else 0 for pixel in pixels)
bits.fill()
return hashlib.md5(bits).hexdigest()