Получить контрольную сумму каталога в голанге

Есть ли способ сгенерировать контрольную сумму всего каталога и его содержимого в golang?

Я знаю, как можно использовать tar для каталога, а затем получить его контрольную сумму, но я бы хотел избежать этого, если это возможно.

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

JimB 02.05.2018 01:04

Я считаю, что необходимо знать причину и контекст этой контрольной суммы. Контрольную сумму каталога нелегко определить, поскольку каталог - это не «вещь», а, скорее, концепция высокого уровня, используемая людьми. В частности, нужна ли вам контрольная сумма, чтобы она действовала в разных файловых системах и / или операционных системах? Следует ли учитывать время изменения и доступа, разрешения или другие метаданные? Не зная вашего варианта использования, невозможно дать осмысленный ответ.

Flimzy 02.05.2018 09:17

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

loonyuni 02.05.2018 18:30
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
3
1 703
2

Ответы 2

Посмотрите пример Параллельное пищеварение из 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, если он подходит для ваших нужд.

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