1

我即将踏上编程之旅,这无疑会以失败和/或将鼠标扔到我的 Mac 上而告终,但这是一个有趣的问题。

我想构建一个应用程序,它从某个基本目录开始扫描并递归地遍历每个文件,如果它找到一个完全重复的文件,它将删除它,并在其位置创建一个符号链接。基本上穷人重复数据删除。这实际上为我解决了一个真正的问题,因为我的 Mac 上有一堆重复文件,我需要释放磁盘空间。

根据我的阅读,这是策略:

  1. 递归循环,并为每个文件生成一个哈希。哈希需要非常独特。这是第一个问题。我应该使用什么哈希?如何通过这个神奇的哈希运行每个文件的整个二进制内容?

  2. 将每个文件的哈希和完整路径存储在键/值存储中。我认为 redis 非常适合它的速度。

  3. 遍历键/值存储,查找重复哈希,删除重复文件,创建符号链接,并将键/值存储中的行标记为副本。

因此,我的问题是:

  • 我应该为每个文件使用什么哈希算法?这是怎么做到的?
  • 我正在考虑使用 node.js,因为 node 通常在 i/o 类型的东西上速度很快。问题是节点吸收了 CPU 密集型的东西,所以散列可能是瓶颈。
  • 我在这里还缺少什么其他问题?
4

2 回答 2

4

我应该为每个文件使用什么哈希算法?这是怎么做到的?

使用 SHA1。Git 使用 SHA1 为文件生成唯一的哈希值。发生碰撞几乎是不可能的。没有已知的标准 SHA1 冲突

我正在考虑使用 node.js,因为 node 通常在 i/o 类型的东西上速度很快。问题是节点吸收了 CPU 密集型的东西,所以散列可能是瓶颈。

您的应用程序将有 2 种操作:

  • 读取文件(IO 绑定)。
  • 计算哈希(CPU 限制)。

我的建议是:不要在脚本语言(Ruby 或 JavaScript)中计算哈希,除非它具有本机哈希库。您可以只调用其他可执行文件,例如sha1sum. 它是用 C 语言编写的,应该很快。

我认为您不需要 NodeJS。NodeJS 在事件驱动 IO 方面速度很快,但它无法提高您的 I/O 速度。我认为您不需要在这里实现事件驱动的 IO。

我在这里还缺少什么其他问题?

我的建议:只需使用您熟悉的语言来实现即可。不要过早地过度设计。仅当您真正遇到性能问题时才对其进行优化。

于 2011-11-28T04:03:07.507 回答
0

有点晚了,但我使用了 miaout 的建议并想出了这个......

var exec = require('child_process').exec;
exec('openssl sha1 "'+file+'"', { maxBuffer: (200*10240) }, function(p_err, p_stdout, p_stderr) {
  var myregexp = /=\s?(\w*)/g;
  var match = myregexp.exec(p_stdout);
  fileInfo.hash = "Fake hash";
  if (match != null) {
    fileInfo.hash = match[1];
  }
  next()
});

可以使用 sha1sum,但与其他所有出色的软件一样,它需要安装 homebrew 之类的东西。当然,如果你有它的环境,你也可以自己编译它。

于 2014-08-24T22:26:45.450 回答