python - 在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)
解决方案
uuid
您可以考虑使用该模块生成唯一的 UUID,将其转换为字符串并将其另存为comment
PNG/JPEG 文件,而不是更改图像的像素内容,这不是很理想。这可确保您的哈希值始终是唯一的。
另请注意,仅使用 PIL 读取 JPEG 并保存它,即使不更改像素,也可能会导致文件大小和像素值发生变化,因为 JPEG 是有损的。所以也许还可以考虑使用exiftool
来设置注释以避免解码和重新编码像素。
推荐阅读
- python - 如何更新窗口中显示的 matplotlib 图表?
- ruby - rbenv 上的 ruby 3.0.0 在哪里
- python - ModuleNotFoundError:bash 中没有名为“selenium”的模块
- php - Wordpress Woo Minicart 插件,带有针对不同语言的购物车字符串和购物车页面链接的 Polylang 问题
- c# - 不从 txt 文件加载某些行的 ETL
- javascript - Freshdesk Oauth SSO:访问 Freshdesk 重定向 URI 时出现 CORS 错误?
- linux - 无法安装 freeradius 服务器安装退出代码 (1)
- git - 在推送到远程(Github)之前,可以使用 `git reset --soft` 撤消提交中的秘密吗?
- testing - Testcafe 从同一个“文件”中连续运行多个夹具或测试
- mysql - 将另一个表中的 COUNT 作为列的查询的正确 MySQL 语法是什么?