c# - 在 C# 中计算图像的 MD5 校验和

标签 c# .net image hash md5

标题为“计算文件的 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/

相关文章:

c# - 自动切换到克隆(液晶显示器和笔记本电脑显示器)显示器?

c# - 使用数据模型在 dynamodb 中进行条件更新

c# - LINQ Select with join 和 optional where

image - 如何将带标题的图像放入 pandoc 的项目符号列表中

c# - 委托(delegate)似乎没有注册 'params'

c# - 从类型名称的字符串表示形式强制转换为类型

python - 如何为异步生成器提供来自 python.net 的事件

c# - 如何将一个本地字符串作为变量传递到另一个字符串的中间? .NET C#

c# - 什么是 PixelOffsetMode?

android - 在 Android 上实现益智游戏