Создание приложения для дедупликации для OS X, что / как я должен использовать в качестве хэша для файлов

Я собираюсь отправиться в путешествие по программированию, которое, несомненно, закончится неудачей и / или пробросит мою мышь через мой Mac, но это интересная проблема.

Я хочу создать приложение, которое сканирует, начиная с некоторого базового каталога, и рекурсивно просматривает каждый файл, и, если оно находит точный дубликат файла, оно удаляет его и создает вместо него символическую ссылку. В основном бедняк дедупликация. Это на самом деле решает реальную проблему для меня, так как на моем Mac есть куча дубликатов файлов, и мне нужно освободить место на диске.

Из того, что я прочитал, это стратегия:

  1. Выполните рекурсивный цикл и создайте хеш для каждого файла. Хеш должен быть чрезвычайно уникальным. Это первая проблема. Какой хеш я должен использовать? Как мне запустить все двоичное содержимое каждого файла через этот магический хеш?

  2. Сохраните каждый файл хэш и полный путь в хранилище ключ / значение. Я думаю, что Redis отлично подходит из-за своей скорости.

  3. Выполните итерацию по хранилищу ключей / значений, найдите дублированные хэши, удалите дубликаты файлов, создайте символическую ссылку и пометьте строку в хранилище ключей / значений как копию.

Поэтому мои вопросы:

  • Какой алгоритм хеширования я должен использовать для каждого файла? Как это сделать?
  • Я думаю об использовании node.js, потому что узел, как правило, работает быстро при вводе-выводе. Проблема заключается в том, что узел сосет на ресурсоемких процессорах, поэтому хэширование, вероятно, станет узким местом.
  • Какие еще ошибки мне здесь не хватает?

2 ответа

Решение

Какой алгоритм хеширования я должен использовать для каждого файла? Как это сделать?

Используйте SHA1. Git использует SHA1 для генерации уникального хэша для файлов. Почти невозможно столкнуться. Нет известного столкновения стандарта SHA1.

Я думаю об использовании node.js, потому что узел, как правило, работает быстро при вводе-выводе. Проблема заключается в том, что узел сосет на ресурсоемких процессорах, поэтому хэширование, вероятно, станет узким местом.

Ваша заявка будет иметь 2 вида операций:

  • Чтение файла (ввод-вывод).
  • Расчет хеша (привязка к процессору).

Мое предложение таково: не вычисляйте хэш на языке сценариев (Ruby или JavaScript), если у него нет встроенной библиотеки хеширования. Вы можете просто вызвать другие исполняемые файлы, такие как sha1sum, Это написано на C и должно быть быстрым.

Я не думаю, что вам нужен NodeJS. NodeJS быстр в ввод-выводе, управляемом событиями, но он не может увеличить вашу скорость ввода-вывода. Я не думаю, что вам нужно реализовывать управляемый событиями ввод-вывод здесь.

Какие еще ошибки мне здесь не хватает?

Мои предложения: просто используйте язык, с которым вы знакомы. Не переусердствуйте слишком рано. Оптимизируйте его только тогда, когда вы действительно столкнетесь с проблемой производительности.

Немного поздно, но я воспользовался советом Мияута и придумал это...

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. Конечно, вы также можете скомпилировать его самостоятельно, если у вас есть среда для этого.

Другие вопросы по тегам