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; } } 几点说明: >这不保证是准确的,但是碰撞的可能性非常小,特别是如果文件也必须是有效的图像. 你如何处理这取决于你的目标是绝对速度,代码的简单性等.它还可能取决于池是否会随着时间的推移而增长 – 例如,你可能希望在获得两个或更多文件时立即散列文件大小相同,因此当您添加相同大小的另一个文件时,您可以对其进行散列并添加它,而无需重新读取现有数据. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |