标题为“计算文件的 MD5 校验和”的 StackOverflow 问题中引用的代码提供了一种根据文件获取校验和的简单方法。这是可行的,但是通过测试我发现更改文件元数据也会导致校验和更改。我想这是有道理的,因为具有不同元数据的副本在技术上是不同的文件。该代码:
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
return md5.ComputeHash(stream);
}
}
当图像在工作中通过各种系统时,图像元数据会因各种原因而添加和更改,这意味着文件校验和无法用于在我们的系统中查找重复项。
我需要的是一种基于图像本身而不是图像文件生成校验和的方法。
我尝试解决这个问题导致了以下代码:
using (var md5 = MD5.Create())
{
using (var stream = new MemoryStream())
{
using (Image image = Image.FromFile(fileName))
{
image.Save(stream, image.RawFormat);
var hash = md5.ComputeHash(stream);
var convertedHash = BitConverter.ToString(hash).Replace("-", String.Empty).ToLowerInvariant();
return convertedHash;
}
}
}
这对我来说似乎非常简单,并且代码运行没有错误,但是无论我输入什么图像,我都会得到相同的校验和,所以有些问题。我似乎无法确定为什么会发生这种行为。任何意见或知识都将不胜感激。为什么这会为任何图像生成相同的校验和?我做错了什么或遗漏了什么?
(编辑:要清楚,我知道图像数据本身必须完全相同才能生成相同的校验和;这就是我所需要的。即,我不想找到相似或非常相似的图像等.)
最佳答案
尝试将流位置重置为开始:
stream.Seek(0, SeekOrigin.Begin);
在Save()
之后和ComputeHash()
之前执行此操作。
关于c# - 在 C# 中计算图像的 MD5 校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75609868/