gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:28:22 25 4
gpt4 key购买 nike

如果一张图片用两个不同的文件名保存了两次,有没有办法比较它们是否相同......?

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

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

希望在 C# 中有一种简单的方法..

最佳答案

如果文件内容相同,那么加密散列至少可以很好地指示是否相等。 SHA256 class 在这里是一个很好的候选人,尽管它可能有点过头了。例如:

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;
}
}

一些注意事项:

  • 不能保证准确,但发生冲突的可能性非常小,尤其是在文件还必须是有效图像的情况下。
  • 这涉及读取所有每个 文件——即使没有其他文件具有相同的大小(因此没有可能的重复)。这对您来说可能是也可能不是问题。
  • 即使多个相同大小的文件,您只需要读取所有文件以找到重复项...您可能会读取文件并边计算哈希值,边停止一旦发现文件不同。

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

关于c# - 匹配两个具有不同文件名的相同图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5994769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com