加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 匹配具有不同文件名的两个相同图像

发布时间:2020-12-15 23:58:54 所属栏目:百科 来源:网络整理
导读:如果一个图像用两个不同的文件名保存了两次,有没有办法比较它们以查看它们是否相同..? 我希望基本的哈希或CRC类型检查可以工作..? 文件大小可能不会,因为池中有数百万个图像,不同的图像可能具有相同的大小. 希望有一个简单的方法在C#中做到这一点.. 解决方
如果一个图像用两个不同的文件名保存了两次,有没有办法比较它们以查看它们是否相同..?

我希望基本的哈希或CRC类型检查可以工作..?

文件大小可能不会,因为池中有数百万个图像,不同的图像可能具有相同的大小.

希望有一个简单的方法在C#中做到这一点..

解决方法

如果文件内容相同,那么加密哈希至少会给出相同的非常好的指示. SHA256级将是一个很好的候选人,虽然它可能有点超过顶部.例如:

static byte[] Sha256HashFile(string file)
{
    using (SHA256 sha256 = SHA256.Create())
    {
        using (Stream input = File.OpenRead(file))
        {
            return sha256.ComputeHash(input);
        }
    }
}

比较两个返回的字节数组的最简单方法可能是使用Convert.ToBase64将它们转换为字符串,然后比较字符串.丑陋但很容易:)你也可以使用Enumerable.SequenceEqual:

byte[] hash1 = Sha256HashFile("file1.png");
byte[] hash2 = Sha256HashFile("file2.png");
bool same = hash1.SequenceEqual(hash2);

如果要将哈希值存储为集合或字典,则可以实现自己的IEqualityComparer< byte []>但坦率地说,使用base64字符串最简单.例如,这将打印出重复的文件:

var hashToNameMap = new Dictionary<string,string>();
foreach (string file in files)
{
    byte[] hash = Sha256HashFile(file);
    string base64 = Convert.ToBase64(hash);
    string existingName;
    if (hashToNameMap.TryGetValue(base64,out existingName))
    {
        Console.WriteLine("{0} is a duplicate of {1}",file,existingName);
    }
    else
    {
        hashToNameMap[base64] = file;
    }
}

几点说明:

>这不保证是准确的,但是碰撞的可能性非常小,特别是如果文件也必须是有效的图像.
>这涉及读取所有文件 – 即使没有其他文件具有相同的大小(因此没有可能的重复).这对您来说可能是也可能不是问题.
>即使有多个相同大小的文件,您只需要阅读所有文件以查找重复项…您可以随时读取文件并计算哈希值,一旦发现文件不同就立即停止.

你如何处理这取决于你的目标是绝对速度,代码的简单性等.它还可能取决于池是否会随着时间的推移而增长 – 例如,你可能希望在获得两个或更多文件时立即散列文件大小相同,因此当您添加相同大小的另一个文件时,您可以对其进行散列并添加它,而无需重新读取现有数据.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读