【问题标题】:Quickly determining if a set of files are identical in C#?在 C# 中快速确定一组文件是否相同?
【发布时间】:2009-07-01 18:11:36
【问题描述】:

我需要能够相对快速地确定用户机器上的一组文件之前是否已被我的应用程序处理过。有问题的应用程序将用户的文件上传到服务器,如果文件之前已经上传过,它会跳过上传。到目前为止,我的计划是对文件进行哈希处理,然后将结果与它们如何上传到服务器的标识符一起存储。我想我会遇到的问题是,由于散列的长度,存储这些数据可能会变得非常麻烦。我现在预计大约有 30-40 个文件,但这可能会增加一倍或(假设)甚至三倍。

这是否可以使用字典进行存储,以散列作为键,服务器信息作为值?然后我会将该字典存储在应用程序的 Properties.Settings.Default 对象中。使用该系统存储是否可行,或者我会在那里遇到某种问题?请注意,由于应用程序的性质,两个用户没有可能拥有相同的数据集,因此我不需要比较用户之间的上传。此外,这种操作的性能如何?用户应至少拥有具有 1 GB RAM 的 Pentium-M 1.5 GHz 处理器。

【问题讨论】:

    标签: c# performance hash settings


    【解决方案1】:

    我可能不会将字典放入 app.config 文件中,尽管我猜你可以,具体取决于服务器信息。我可能只是将它单独放在一个文本文件中,除非您发现由于某种原因这更成问题。感觉它是应用程序而不是配置应用程序的更多数据。

    性能根本不应该成为问题 - 字典被设计为仍然有效地处理 数百万 个条目,更不用说您所说的数以百计的条目了。

    【讨论】:

    • 我实际上并不打算将它存储在 app.config 文件中,而是将其存储在 user.config 文件中。尽管您的观点很好,但我可能会将其分开。不需要 user.config 文件来气球!至于字典,我想知道它可以存储的大小键是否有长度?如果我只是将哈希连接在一起会起作用吗?为了性能,我担心文件的散列。这些用户的笔记本电脑能否在合理的时间内做到这一点?
    • 没有必要开始连接散列 - 每个散列都相当短,而且字典可以处理长键。是的,笔记本电脑应该绝对适合散列 - 大多数散列在计算上相对便宜;大部分时间将用于读取文件。
    • 我想我错过了一条重要的信息。这些文件作为一组放在一起,因此为每个文件创建一个字典条目真的没有意义,不是吗?
    【解决方案2】:

    关于获取哈希值,我想我会提到这个......

    使用散列值是好的,只要你每次都能得到相同的结果而不会失败。我在某处读到 .GetHashCode() 在不同版本的 .NET 之间不一样,所以如果您打算将哈希保存在持久状态,我会避免使用 .GetHashCode()。如果一次全部完成,那么 .GetHashCode() 非常适合比较事物是否相同。

    如果您需要持久化哈希,.NET 中有可用的哈希类。诚然,我不是这方面的专家,但我认为 SHA1 有一种散列方法。

    【讨论】:

    • 对于文件,哈希通常指的是 SHA1、MD5 等,而不是 GetHashCode()。我当然假设这就是OP的意思......
    • 可能是这样,但又有些人不知道,所以我想我还是把它扔在那里。
    • 是的,这正是我的意思。谢谢斯基特先生。 :)
    【解决方案3】:

    为什么不比较文件修改日期时间呢?为此,您需要将修改后的日期保存在服务器上。

    【讨论】:

    • 我不想那样做。我拥有对服务器的 SCP 访问权限,但我希望将网络流量保持在最低限度,因此需要避免重新上传相同的数据。随着用户群的增长,拉下服务器的目录可能会变得非常缓慢,并且考虑到用户之间不可能发生文件冲突,非常浪费。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2013-03-20
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多