我即将踏上编程之旅,这无疑会以失败和/或将我的鼠标扔到我的 Mac 上而告终,但这是一个有趣的问题。
我想构建一个应用程序,它从某个基本目录开始扫描并递归循环遍历每个文件,如果它找到一个完全相同的文件,它将删除它,并在其位置创建一个符号链接(symbolic link)。基本上穷人重复数据删除。这实际上为我解决了一个真正的问题,因为我的 Mac 上有一堆重复的文件,我需要释放磁盘空间。
据我所知,这是策略:
递归循环,并为每个文件生成哈希。散列必须非常独特。这是第一个问题。我应该使用什么哈希?我如何通过这个神奇的哈希运行每个文件的全部二进制内容?
将每个文件的哈希值和完整路径存储在键/值存储中。我认为 Redis 因其速度而非常适合。
遍历键/值存储,找到重复的哈希,删除重复的文件,创建符号链接(symbolic link),并将键/值存储中的行标记为副本。
因此我的问题是:
- 我应该为每个文件使用什么散列算法?这是怎么做到的?
- 我正在考虑使用 node.js,因为 node 通常在 i/o 类型的事情上速度很快。问题是 Node 在 CPU 密集型的东西上很糟糕,所以散列可能是瓶颈。
- 我还遗漏了哪些问题?
最佳答案
What hashing algorithm should I use for each file? How is this done?
使用 SHA1。 Git 使用 SHA1 为文件生成唯一的哈希值。几乎不可能发生碰撞。 There is no known collision of standard SHA1 .
I'm thinking about using node.js because node generally is fast at i/o types of things. The problem is that node sucks at CPU intensive stuff, so the hashing will probably be the bottleneck.
您的应用程序将有 2 种操作:
- 读取文件(IO 绑定(bind))。
- 计算哈希值(受 CPU 限制)。
我的建议是:不要在脚本语言(Ruby 或 JavaScript)中计算哈希,除非它有原生的哈希库。您可以只调用其他可执行文件,例如 sha1sum
。它是用 C 语言编写的,应该非常快。
我认为您不需要 NodeJS。 NodeJS 在事件驱动 IO 中速度很快,但它不能提高你的 I/O 速度。我认为你不需要在这里实现事件驱动的 IO。
What other gotchas am I missing here?
我的建议:用你熟悉的语言来实现。不要过早过度设计。只有当你真的遇到性能问题时才优化它。
关于node.js - 为 OS X 构建重复数据删除应用程序,我应该使用什么/如何作为文件的哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8291310/