【问题标题】:What algorithm should be used when doing filechecksums to find dupes?在进行文件校验和查找骗子时应该使用什么算法?
【发布时间】:2010-12-31 21:50:17
【问题描述】:

采用 MD5 和是否仍然适合检查文件重复?我知道它不安全,但是在尝试查找文件重复的情况下这真的很重要吗?

我应该改用 SHA 系列中的东西吗?

这个用例的最佳实践是什么?

【问题讨论】:

    标签: language-agnostic md5 checksum duplicate-data sha


    【解决方案1】:

    SHA1 作为校验和略好于 MD5。这是 Git 使用的。

    【讨论】:

      【解决方案2】:

      此时 MD5 存在已知漏洞,但这对您的应用程序来说可能不是问题。它仍然可以很好地区分成堆的比特。如果出现不匹配的内容,那么您知道您还没有看到它,因为该算法是确定性的。如果某些东西作为匹配返回,您实际上应该将其与表面上匹配的 blob 进行比较,然后再将其视为真的重复。 MD5 相对较快,但如果您无法对哈希冲突进行全文比较,您可能应该使用更强的哈希,例如 SHA-256。

      【讨论】:

        【解决方案3】:

        在这种特殊情况下,算法的选择可能并不那么重要。使用 SHA1 而不是 MD5 的关键原因都与创建加密安全签名有关。

        MD5 对于这项任务应该是完全可以接受的,因为您可能不需要担心有人恶意制作文件以生成虚假副本。

        【讨论】:

          【解决方案4】:

          虽然 MD5 确实有一些冲突,但我一直将它用于文件并且它工作得很好。

          【讨论】:

            【解决方案5】:

            出于描述的目的,没有真正可取的解决方案,两种哈希函数都可以解决问题。无论如何,MD5 通常会比 SHA1 稍快。

            python中的示例:

            #!/usr/bin/env python
            
            import hashlib, cProfile
            
            def repeat(f, loops=10000000):
                def wrapper(): 
                    for i in range(loops): f()
                return wrapper
            
            @repeat
            def test_md5():
                md5 = hashlib.md5(); md5.update("hello"); md5.hexdigest()
            
            @repeat 
            def test_sha1():
                sha = hashlib.sha1(); sha.update("hello"); sha.hexdigest()
            
            cProfile.run('test_md5()')
            cProfile.run('test_sha1()')
            
            #
            #         40000004 function calls in 59.841 CPU seconds
            # 
            # ....
            #
            #         40000004 function calls in 65.346 CPU seconds
            # 
            # ....
            

            【讨论】:

              【解决方案6】:

              您所说的是校验和,它与加密哈希相关(但不相同)。

              是的,只要您不担心恶意用户故意制作具有相同校验和的两个不同文件,MD5 甚至 CRC 都可以作为校验和正常工作。如果这问题,请使用 SHA1,或者更好的是,使用一些 cryptographically unbroken 哈希。

              【讨论】:

                【解决方案7】:

                如果您关心性能,我认为最好先检查匹配的文件大小,然后使用快速哈希函数(CRC32 或 MD5,它应该比 SHA1 更快)并尝试使用 MD5 以这种方式找到可能的重复文件、SHA1 或 SHA256(取决于任务的关键性)。

                【讨论】:

                  【解决方案8】:

                  我们在工作中使用 MD5 来满足您的需求。效果很好。我们只需要在每个客户的基础上检测重复上传,这减少了我们对birthday problem 的曝光,但是如果我们必须检测所有上传而不是每个客户的重复,md5 对我们来说仍然足够。如果您可以相信互联网,给定 n 个样本和 b 的哈希大小的碰撞概率 p 为:

                  p <= n (n - 1) / (2 * 2 ^ b)
                  

                  几年前,我计算了 n = 10^9 和 b = 128,得出了 p

                  【讨论】:

                    猜你喜欢
                    • 2011-05-13
                    • 1970-01-01
                    • 2010-11-09
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-03-13
                    • 2016-01-31
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多