Создание приложения для дедупликации для OS X, что / как я должен использовать в качестве хэша для файлов
Я собираюсь отправиться в путешествие по программированию, которое, несомненно, закончится неудачей и / или пробросит мою мышь через мой Mac, но это интересная проблема.
Я хочу создать приложение, которое сканирует, начиная с некоторого базового каталога, и рекурсивно просматривает каждый файл, и, если оно находит точный дубликат файла, оно удаляет его и создает вместо него символическую ссылку. В основном бедняк дедупликация. Это на самом деле решает реальную проблему для меня, так как на моем Mac есть куча дубликатов файлов, и мне нужно освободить место на диске.
Из того, что я прочитал, это стратегия:
Выполните рекурсивный цикл и создайте хеш для каждого файла. Хеш должен быть чрезвычайно уникальным. Это первая проблема. Какой хеш я должен использовать? Как мне запустить все двоичное содержимое каждого файла через этот магический хеш?
Сохраните каждый файл хэш и полный путь в хранилище ключ / значение. Я думаю, что Redis отлично подходит из-за своей скорости.
Выполните итерацию по хранилищу ключей / значений, найдите дублированные хэши, удалите дубликаты файлов, создайте символическую ссылку и пометьте строку в хранилище ключей / значений как копию.
Поэтому мои вопросы:
- Какой алгоритм хеширования я должен использовать для каждого файла? Как это сделать?
- Я думаю об использовании 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. Конечно, вы также можете скомпилировать его самостоятельно, если у вас есть среда для этого.