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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 28 ноября 2011

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

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

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

Ваше приложение будет иметь 2 вида операций:

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

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

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

Какие еще ошибки я здесь упускаю?

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

0 голосов
/ 25 августа 2014

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

...