首页 > 解决方案 > 在python中创建一个唯一的图像哈希

问题描述

我使用一个程序将一些图像在线存储(群),其中链接直接从图像数据计算以构建散列。

问题是,如果我上传 2 次相同的图像,它会创建相同的散列,这是我不想要的:我希望每个散列都是唯一的,即使照片是相同的。

因此,我搜索了一种在 python 中修改图像的方法,然后再上传它。

例如,我尝试用这样的随机选择修改 1 个像素:

from random import randint

image = Image.open(file)
i = randint(30, image.size[0] - 30)
j = randint(30, image.size[1] - 30)
pixels = image.load()
pixels[i,j]=(pixels[i, j][0], pixels[i, j][1] - 1, pixels[i, j][2])

但由于某种原因,我不明白它不会改变任何哈希

我也试图修改图像的信息,但没有成功(使用当前的UTC时间+随机代码)

那么你有解决这个问题的方法吗?

在这里你有 swarm 的文档:https ://docs.ethswarm.org/docs/getting-started/upload-and-download 上面写着“在 Swarm 中,每条数据都有一个唯一的地址,这是一个唯一且可重复的密码哈希摘要。如果您两次上传相同的文件,您将始终收到相同的哈希。这使得在 Swarm 中处理数据超级安全!

所以我不明白为什么修改 1 个像素不起作用。

另外,如果它可以提供帮助,这里是我在 swarm 上上传文件的方式

headers = {"content-type": f"image/png", "Swarm-Pin": "true"}
result = requests.post("https://gateway.ethswarm.org/files", data=file, headers=headers)

编辑:我按照评论中的要求尝试了完整的代码:

image = Image.open(file)
output = io.BytesIO()
i = randint(0, image.size[0])
j = randint(0, image.size[1])
pixels = image.load()
pixels[i,j]=(pixels[i, j][0], pixels[i, j][1] - 1, pixels[i, j][2])
image.save(output, format=image_format)
result = requests.post("https://gateway.ethswarm.org/files", data=output.getvalue(), headers=headers)

标签: pythonimagehashpython-imaging-library

解决方案


uuid您可以考虑使用该模块生成唯一的 UUID,将其转换为字符串并将其另存为commentPNG/JPEG 文件,而不是更改图像的像素内容,这不是很理想。这可确保您的哈希值始终是唯一的。

另请注意,仅使用 PIL 读取 JPEG 并保存它,即使不更改像素,也可能会导致文件大小和像素值发生变化,因为 JPEG 是有损的。所以也许还可以考虑使用exiftool来设置注释以避免解码和重新编码像素。


推荐阅读