是否有效使用改变音频(mp3)文件的哈希值

时间:2013-04-16 09:10:20

标签: c# hash tags mp3 id3

我要创建一个音乐库程序,很简单。存储信息很容易。

我之前看过用c#制作的另一个音乐库,这家伙声称即使你移动文件,重新发现它也会知道从数据库中检索到的有关该文件的所有信息(xml,sql)。

有关重新发现的更多信息:当您移动文件时,您必须重新发现音乐库,因为其当前信息是错误的,例如文件路径,重新发现它将找到该文件,在数据库中检查它,以及更新任何信息

我认为这是不可能的,直到现在。如果您对文件进行哈希并使用该哈希作为键,则可以使用该哈希值来检查文件以确保它是唯一的。

如果我错了,请纠正我并确认我说的是真的(这是问题)。

  • 文件路径不用于散列文件。 (我不知道怎么哈希)
  • 每次写入ID3标签后重新哈希(更改文件会改变哈希值吗?)
  • 使用哈希作为密钥/ ID将意味着如果文件被移动,它仍然可以参考存储的信息
  • 一旦从xml读取信息读取(如果我们使用xml作为数据库)文件,将其存储在字典中是将内容存储在内存中的最快捷方式

这是一个问题,需要答案,关于c#。我正在使用c#,这就是为什么它具体,我正在进行背景研究,我只是想对我所陈述的内容有一些专家意见

3 个答案:

答案 0 :(得分:3)

回答你的问题

    计算哈希时不应使用
  • 文件路径。文件名和扩展名都没有。

  • 在每次ID3标记写入后重新散列将解决您的问题,前提是您的应用程序中发生了所有更改

  • hash可以安全地用作您的密钥(见下文)

  • 可能是的,如果我理解正确

重复哈希值的可能性

根据您选择的散列函数,如果您搜索,您将在年,千年,十亿年中找到/生成具有相同散列的另一个文件,或者直到世界末日才会执行此操作。

这完全是概率问题。检查details of each hashing function以了解找到具有相同散列的另一个文件的概率有多低。

mp3文件中已更改标签的问题

虽然这可能是一个问题,但您需要做的只是散列不是ID3标记的文件部分。它们通常位于文件末尾,占文件大小的很小一部分。

您可以做的是在文件中使用散列函数,该函数不会发生变化。 在散列时跳过文件的最后N个字节。

答案 1 :(得分:1)

是的,如果您对文件内容进行哈希处理,那么即使该文件移动到其他位置,当您再次执行该操作时,它仍会产生相同的哈希值。所以,是的,您可以根据内容的哈希值完全识别文件(这就是Git所做的事情)。至于创建文件的哈希值,有几个问题会告诉您如何执行此操作,例如this one

请注意,由于ID3标签和内容,您的文件不是不可变的,因此对文件内容进行散列可能不是最好的主意。如果更改文件的标记,其哈希值将更改,从而生成 new 文件(至少对您的应用程序而言)。当然,如果您更改应用程序中的标签,那么您可以轻松地跟踪这些更改并更新旧记录以使用新哈希。同样的想法也可以应用于基于其路径识别文件(如果您在应用程序中移动它,您也可以只更新其在数据库中的路径)。但问题是这些操作都可能发生在您的应用程序之外。

因此,两种识别方法(文件内容的散列或文件路径)都有些缺陷,但是没有真正的替代方法来识别文件。

答案 2 :(得分:1)

散列对你有用。它基本上根据文件中的所有字节创建校验和。使用好的哈希将为每个文件提供一个独特的签名(连续五次赢得抽奖的机会更多,因为找到两个不同的哈希文件)。

问题是您需要读取整个文件来计算哈希值。这可能会影响性能。

因此,在重新发行时,您可能需要先检查文件大小是否相同。如果不是,则不需要读取整个文件并计算散列。但是你需要存储文件大小和哈希值。

有关散列的一些信息(使用MD5方法)

http://www.fastsum.com/support/md5-checksum-utility-faq/md5-hash.php