【问题标题】:How can I efficiently compute the md5 sum of an iterable of bits in Python?如何有效地计算 Python 中可迭代位的 md5 总和?
【发布时间】:2015-10-25 00:26:09
【问题描述】:

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

附:我可以重现位数组的不确定性,但我认为这只是将两个不应该一起工作的东西一起使用的功能。

【问题讨论】:

  • 只要正确地完成从一件事到另一件事的接口,它们就没有理由不能一起工作。 bitarray 不会产生不确定的结果,如果它产生了,那将毫无用处。顺便说一句,您可以使用 bits = bitarray(pixel &lt; avg for pixel in pixels) 简化一些事情。
  • @martineau,我已经改进了你的代码,谢谢。 John 解开了非确定性之谜(我需要用零填充)。

标签: python hash md5 generator bitarray


【解决方案1】:

如果 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()

【讨论】:

  • 谢谢!我特别感谢指向memoryviewfill 的指针。我是否可以推断出现在 bitarray 的行为这种方法相当有效?
  • kuzzooroo:很难说这是否“有效”。它通过对较少的值求和来计算 md5,但需要大量的处理来生成它们。只有计时才能确定它是否比其他选择更快。应该注意的是,使用这种方法的一个主要副作用是,与将 md5 应用于图像中的所有原始数据相比,它不太可能检测到图像差异——如果你正在使用它来做的话。跨度>
猜你喜欢
  • 2019-12-11
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
相关资源
最近更新 更多