为OS X构build重复数据删除应用程序,我应该如何使用它作为文件的哈希值

我即将开始编程之旅,毫无疑问,它将以失败告终,并且/或者将我的鼠标通过我的Mac投掷出去,但这是一个有趣的问题。

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

从我所读到的,这是战略:

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

  2. 将每个文件散列和全path存储在键/值存储中。 我认为redis是一个非常好的select,因为它的速度。

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

因此我的问题是:

  • 我应该为每个文件使用什么散列algorithm? 这是怎么做的?
  • 我在考虑使用node.js,因为节点通常在I / Otypes的东西上很快。 问题是节点吸取CPU密集的东西,所以哈希可能是瓶颈。
  • 我还有什么其他的缺点?

我应该为每个文件使用什么散列algorithm? 这是怎么做的?

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

我在考虑使用node.js,因为节点通常在I / Otypes的东西上很快。 问题是节点吸取CPU密集的东西,所以哈希可能是瓶颈。

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

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

我的build议是:不要在脚本语言(Ruby或JavaScript)中计算散列,除非它具有本机散列库。 您可以调用其他可执行文件,如sha1sum 。 这是写在C,应该快速。

我不认为你需要NodeJS。 NodeJS在事件驱动的IO中速度很快,但它不能提高你的I / O速度。 我不认为你需要在这里实现事件驱动的IO。

我还有什么其他的缺点?

我的build议:只要用你熟悉的语言来实现。 不要过度工程太早。 只有在确实遇到性能问题时才进行优化。

有点晚了,但我用miaout的build议,想出了这个…

 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,但像其他伟大的软件,它会需要像自制软件安装。 当然你也可以自己编译它,如果你有它的环境。