file - 判断两个 MP3 文件是否重复的最快方法是什么?

标签 file hash md5

我想编写一个程序来删除重复的 iTunes 音乐文件。识别欺骗的一种方法是比较 MP3 和 m4a 文件的 MD5 摘要。有没有更有效的策略?

顺便说一句,iTunes 上的“显示重复项”菜单命令显示误报。显然它只是在艺术家和轨道标题字符串上进行比较。

最佳答案

如果您使用散列来比较两组数据,理想情况下,它们每次都必须具有完全相同的输入才能获得完全相同的输出(除非您奇迹般地选择了两个不同输入的碰撞导致相同的输出)。如果您想通过散列整个文件来比较两个 MP3 文件,那么这两组歌曲数据可能完全相同,但由于 ID3 存储在文件中,其中的差异可能会使文件看起来完全不同。由于您使用的是散列,因此您不会注意到两个文件中可能有 99% 是匹配的,因为输出会大不相同。

如果您真的想使用散列来执行此操作,您应该只散列声音数据,不包括可能附加到文件的任何标签。不推荐这样做,例如,如果从 CD 中翻录音乐,并且同一张 CD 被翻录两次,结果可能会根据翻录参数进行不同的编码/压缩。

更好(但更复杂)的替代方法是尝试比较未压缩的音频数据值。通过对已知输入的一些尝试和错误,可以产生一个不错的算法。完美地做到这一点将非常困难(如果可能的话),但如果你得到的东西的准确率超过 50%,那会比手工完成要好。

请注意,即使是可以检测两首歌曲是否接近的算法(比如在不同参数下翻录的同一首歌曲),该算法也必须比判断现场版本是否类似于录音室版本更复杂。如果你能做到这一点,这里就有赚钱的机会!

并回到最初的想法,即判断它们是否重复的速度。散列会快得多,但比具有此目的的任何算法准确度要低得多。这是速度与准确性和复杂性的对比。

关于file - 判断两个 MP3 文件是否重复的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6918450/

相关文章:

java - 是否可以从 MD5 和 Java 恢复消息?

file - 在 Powershell 中检查文件大小 gt 0

BASH 脚本,用于按基本文件名将文件递归排序到同名文件夹中

Ruby 按条件搜索哈希

hash - 哈希中 'character'和 'octet'之间的区别

java - 使用 Java 为大文件生成 MD5 非常慢

encoding - Blackberry 编码 MD5 与 C# 中的 MD5 不同

c++ - 在 C++ 中读取 Fortran 二进制文件

Python-从多个文件中读取

c - 使用 Joshua Davies 的书 "Implementing SSL/TLS Using Cryptography and PKI"实现 TLS 服务器/客户端