mysql /文件哈希问题

时间:2010-09-25 21:52:47

标签: mysql hash duplicates directory

我想编写一个遍历文件树的脚本,计算每个文件的哈希值,然后将哈希值与文件路径一起插入SQL表中,这样我就可以查询和搜索相同。 什么是推荐的哈希函数或命令工具来创建对于不同文件极不可能相同的哈希? 谢谢 乙

3 个答案:

答案 0 :(得分:1)

我一直在研究这个问题太久了。我正在进行第三次(希望是最后的)重写。

一般来说,我建议使用SHA1,因为它没有已知的冲突(而MD5冲突can be found in minutes),而SHA1在使用硬盘时不会成为瓶颈。如果您痴迷于让您的程序在固态驱动器存在的情况下快速运行,请使用MD5,或者浪费时间和天数来确定如何并行化操作。在任何情况下,都不会并行化哈希,直到你的程序完成了你需要做的所有事情。

另外,我建议使用sqlite3。当我在PostgreSQL数据库中创建程序存储文件哈希时,数据库插入是一个真正的瓶颈。当然,我本可以尝试使用COPY(我忘了,如果我做了或不做),我猜这本来会相当快。

如果您使用sqlite3并在BEGIN / COMMIT块中执行插入操作,那么在索引存在的情况下,您可能会查看每秒大约10000次插入。但是,您可以使用生成的数据库进行操作,这一切都值得。我用大约750000个文件(85 GB)做到了这一点。整个插入和SHA1哈希操作花了不到一个小时,它创建了一个140MB的sqlite3文件。但是,我查找重复文件并按ID排序的查询运行时间不到20秒。

总之,使用数据库很好,但请注意插入开销。 SHA1比MD5更安全,但CPU功耗约为2.5倍。但是,I / O往往是瓶颈(CPU紧随其后),因此使用MD5而不是SHA1确实不会为您节省太多时间。

答案 1 :(得分:0)

你可以使用md5 hash或sha1

  function process_dir($path) {

    if ($handle = opendir($path)) {
      while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
           if (is_dir($path . "/" . $file)) {
              process_dir($path . "/" . $file);
           } else {
              //you can change md5 to sh1
              // you can put that hash into database
              $hash = md5(file_get_contents($path . "/" . $file)); 
           }
        }
      }
      closedir($handle);
  }
 }

如果您在Windows中工作,请将斜杠更改为反斜杠。

答案 2 :(得分:0)

这是我想出的解决方案。我没有在PHP中完成所有这些操作,但如果你想要它很容易做到:

$fh = popen('find /home/admin -type f | xargs sha1sum', 'r');
$files = array();
while ($line = fgets($fh)) {
    list($hash,$file) = explode('  ', trim($line));

    $files[$hash][] = $file;
}
$dupes = array_filter($files, function($a) { return count($a) > 1; });

我意识到我这里没有使用过数据库。你要索引多少个文件?您是否需要将数据放入数据库然后在那里搜索欺骗?