3

I'm going to create a music library program, easy. Storing the information, easy.

I previously looked at another music library made in c#, the guy claimed that even if you move the file, on rediscovery it will know all the information about that file retrieved from the database (xml, sql).

More info on rediscovery: When you move files you have to get the music library to rediscover because its current information is wrong, such as the file path, on re discovery it will find the file, check it in the database, and update any information

I thought this is impossible, till now. If you hash a file and use that hash as the key, you can then use that to always check the file to make sure it is the one.

Please correct me if I'm wrong and confirm what I'm saying is true (that is the question).

  • File path isn't used in hashing the file. (I don't know how to hash)
  • Re hash after every ID3 tag write (changing the file changes the hash?)
  • Using the Hash as an Key/Id will mean that if the file is moved it can be still referenced to the information stored about it
  • Once information read is read out of the xml (if we're using xml as a database) file, storing it in a dictionary is the quickest and best way to have the contents in memory

It is a question, it needs an answer, its about c#. I'm using c#, thats why it's specific, I'm doing background research, I just wanted some expert opinion on what i've stated

4

3 回答 3

4

回答您的问题

  • 计算哈希时不应使用文件路径。既不是文件名也不是扩展名。

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

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

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

重复哈希值的可能性

根据您选择的散列函数,如果您搜索,您将在年、千年、十亿年中找到/生成另一个具有相同散列的文件,或者直到世界末日您都不会这样做。

这都是概率问题。检查每个散列函数的详细信息,以了解找到具有相同散列的另一个文件的概率有多低。

mp3 文件中更改标签的问题

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

您可以做的是在不会更改的文件部分使用散列函数。散列时只需跳过文件的最后 N 个字节

于 2013-04-16T09:26:47.293 回答
1

是的,如果你散列文件内容,那么即使文件移动到其他地方,当你再次执行它时,它仍然会产生相同的散列。所以是的,您可以根据文件内容的哈希值完全识别文件(例如,这就是 Git 所做的)。至于创建文件的哈希,有几个问题会告诉你如何去做,例如这个.

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

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

于 2013-04-16T09:27:33.733 回答
1

哈希将为您工作。它基本上根据文件中的所有字节创建校验和。使用良好的哈希将为您提供每个文件的唯一签名(如果找到两个具有相同哈希的不同文件,则更有可能连续五次中奖)。

问题是您需要读取整个文件来计算哈希。这可能会稍微损害性能。

因此,在重新发现时,您可能需要首先检查文件大小是否相同。如果没有,则无需读取整个文件并计算哈希。但是您需要为此存储文件大小和哈希。

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

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

于 2013-04-16T09:31:33.880 回答