我要创建一个音乐库程序,很简单。存储信息很容易。
我之前看过用c#制作的另一个音乐库,这家伙声称即使你移动文件,重新发现它也会知道从数据库中检索到的有关该文件的所有信息(xml,sql)。
有关重新发现的更多信息:当您移动文件时,您必须重新发现音乐库,因为其当前信息是错误的,例如文件路径,重新发现它将找到该文件,在数据库中检查它,以及更新任何信息
我认为这是不可能的,直到现在。如果您对文件进行哈希并使用该哈希作为键,则可以使用该哈希值来检查文件以确保它是唯一的。
如果我错了,请纠正我并确认我说的是真的(这是问题)。
这是一个问题,需要答案,关于c#。我正在使用c#,这就是为什么它具体,我正在进行背景研究,我只是想对我所陈述的内容有一些专家意见
答案 0 :(得分:3)
文件路径。文件名和扩展名都没有。
在每次ID3标记写入后重新散列将解决您的问题,前提是您的应用程序中发生了所有更改
hash可以安全地用作您的密钥(见下文)
可能是的,如果我理解正确
根据您选择的散列函数,如果您搜索,您将在年,千年,十亿年中找到/生成具有相同散列的另一个文件,或者直到世界末日才会执行此操作。
这完全是概率问题。检查details of each hashing function以了解找到具有相同散列的另一个文件的概率有多低。
虽然这可能是一个问题,但您需要做的只是散列不是ID3标记的文件部分。它们通常位于文件末尾,占文件大小的很小一部分。
您可以做的是在文件中使用散列函数,该函数不会发生变化。 在散列时跳过文件的最后N个字节。
答案 1 :(得分:1)
是的,如果您对文件内容进行哈希处理,那么即使该文件移动到其他位置,当您再次执行该操作时,它仍会产生相同的哈希值。所以,是的,您可以根据内容的哈希值完全识别文件(这就是Git所做的事情)。至于创建文件的哈希值,有几个问题会告诉您如何执行此操作,例如this one。
请注意,由于ID3标签和内容,您的文件不是不可变的,因此对文件内容进行散列可能不是最好的主意。如果更改文件的标记,其哈希值将更改,从而生成 new 文件(至少对您的应用程序而言)。当然,如果您更改应用程序中的标签,那么您可以轻松地跟踪这些更改并更新旧记录以使用新哈希。同样的想法也可以应用于基于其路径识别文件(如果您在应用程序中移动它,您也可以只更新其在数据库中的路径)。但问题是这些操作都可能发生在您的应用程序之外。
因此,两种识别方法(文件内容的散列或文件路径)都有些缺陷,但是没有真正的替代方法来识别文件。
答案 2 :(得分:1)
散列对你有用。它基本上根据文件中的所有字节创建校验和。使用好的哈希将为每个文件提供一个独特的签名(连续五次赢得抽奖的机会更多,因为找到两个不同的哈希文件)。
问题是您需要读取整个文件来计算哈希值。这可能会影响性能。
因此,在重新发行时,您可能需要先检查文件大小是否相同。如果不是,则不需要读取整个文件并计算散列。但是你需要存储文件大小和哈希值。
有关散列的一些信息(使用MD5方法)
http://www.fastsum.com/support/md5-checksum-utility-faq/md5-hash.php