在 python 中创建图像的唯一哈希
Create a unique hash of image in python
我使用一个程序将一些图像存储在存储中(群),其中 link 直接从图像数据计算以构建哈希。
问题是,如果我上传同一张图片两次,它会创建相同的散列,这是我不想要的:我希望每个散列都是唯一的,即使照片是相同的。
所以我在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])
但出于我不明白的原因,它不会对哈希值进行任何更改
我也试过修改图片的so信息,没有成功(用当前UTC时间+随机码)
那么你有办法解决这个问题吗?
这里有 swarm 的文档:https://docs.ethswarm.org/docs/getting-started/upload-and-download
哪个说
“在 Swarm 中,每条数据都有一个唯一的地址,这是一个唯一且可重现的加密哈希摘要。如果你两次上传同一个文件,你将始终收到相同的哈希值。这使得在 Swarm 中处理数据超级安全!” =15=]
所以我不明白为什么修改 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
设置注释以避免对像素进行解码和重新编码。
我使用一个程序将一些图像存储在存储中(群),其中 link 直接从图像数据计算以构建哈希。
问题是,如果我上传同一张图片两次,它会创建相同的散列,这是我不想要的:我希望每个散列都是唯一的,即使照片是相同的。
所以我在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])
但出于我不明白的原因,它不会对哈希值进行任何更改
我也试过修改图片的so信息,没有成功(用当前UTC时间+随机码)
那么你有办法解决这个问题吗?
这里有 swarm 的文档:https://docs.ethswarm.org/docs/getting-started/upload-and-download 哪个说 “在 Swarm 中,每条数据都有一个唯一的地址,这是一个唯一且可重现的加密哈希摘要。如果你两次上传同一个文件,你将始终收到相同的哈希值。这使得在 Swarm 中处理数据超级安全!” =15=]
所以我不明白为什么修改 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
设置注释以避免对像素进行解码和重新编码。