node.js - 为 OS X 构建重复数据删除应用程序,我应该使用什么/如何作为文件的哈希

标签 node.js file-io redis symlink deduplication

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

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

据我所知,这是策略:

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

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

  3. 遍历键/值存储,找到重复的哈希,删除重复的文件,创建符号链接(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/

相关文章:

node.js - Google App Engine,index.html 在 Express/React 应用程序中部署后缓存

node.js - 在命令行上使用 ImageMagick 将 PDF 转换为图像

node.js - 如何将 node.js 应用程序作为后台服务运行?

python - python 列表中的循环不递增

c++ - 无法从文件中读取

spring-boot - 如何为 Spring Session 提供的 RedisMessageListenerContainer 配置额外的 MessageListener?

node.js - 我应该为 iisnode 设置哪种托管管道模式?

python - 仅替换文本文件第一行中的某些元素

redis - Express-Gateway-基本身份验证/Redis性能问题

hash - Redis 中散列上的原子 GETSET