Есть ли способ сгенерировать контрольную сумму всего каталога и его содержимого в golang?
Я знаю, как можно использовать tar для каталога, а затем получить его контрольную сумму, но я бы хотел избежать этого, если это возможно.
Я считаю, что необходимо знать причину и контекст этой контрольной суммы. Контрольную сумму каталога нелегко определить, поскольку каталог - это не «вещь», а, скорее, концепция высокого уровня, используемая людьми. В частности, нужна ли вам контрольная сумма, чтобы она действовала в разных файловых системах и / или операционных системах? Следует ли учитывать время изменения и доступа, разрешения или другие метаданные? Не зная вашего варианта использования, невозможно дать осмысленный ответ.
Понимаю, мои рассуждения в основном заключались в том, что каталог верхнего уровня довольно большой. Я решил использовать другой подход, специфичный для моей общей проблемы, но спасибо за то, что просветил меня об отсутствии разницы между ними.
Посмотрите пример Параллельное пищеварение из https://blog.golang.org/pipelines, начиная с раздела Переваривание дерева, вероятно, он может дать вам некоторые идеи.
Итак, вы можете перейти от:
// MD5All reads all the files in the file tree rooted at root and returns a map
// from file path to the MD5 sum of the file's contents. If the directory walk
// fails or any read operation fails, MD5All returns an error.
func MD5All(root string) (map[string][md5.Size]byte, error) {
m := make(map[string][md5.Size]byte)
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.Mode().IsRegular() {
return nil
}
data, err := ioutil.ReadFile(path)
if err != nil {
return err
}
m[path] = md5.Sum(data)
return nil
})
if err != nil {
return nil, err
}
return m, nil
}
К параллельной версии: https://blog.golang.org/pipelines/parallel.go
Для go mod
Расс Кокс написал дирхаш.
Есть два подхода: один хеширует файлы в каталоге, другой хеширует zip-архив, игнорируя недетерминированную информацию, такую как дата файла.
Дополнительные метаданные не обязательно имеют значение для содержимого файла и, вероятно, их следует игнорировать. Я рекомендую сначала изучить метод zip, если он подходит для ваших нужд.
Чего конкретно вы пытаетесь избежать? На самом деле нет большой разницы между получением контрольной суммы потока tar и рекурсивным чтением каждого файла и списка каталогов. Я имею в виду, что формат tar технически не нужен, но вам нужен формат каталога некоторый для контрольной суммы, поэтому tar может быть не хуже любого другого.