Хеш, или так называемая контрольная сумма является самым простым способом сравнения контента для проверки на изменения. Далее будет показано, как создать контрольную сумму из содержимого файла. В целях демонстрации будет использовать хеш функция MD5.
Как создать MD5 хеш-сумму файла в Golang?
1. Создайте файл content.dat
со следующим содержимым:
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
1 |
This is content to check |
2. Создайте файл checksum.go
со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
package main import ( "crypto/md5" "fmt" "io" "os" ) var content = "This is content to check" func main() { checksum := MD5(content) checksum2 := FileMD5("content.dat") fmt.Printf("Checksum 1: %s\n", checksum) fmt.Printf("Checksum 2: %s\n", checksum2) if checksum == checksum2 { fmt.Println("Content matches!!!") } } // MD5 - Превращает содержимое из переменной data в md5-хеш func MD5(data string) string { h := md5.Sum([]byte(data)) return fmt.Sprintf("%x", h) } // FileMD5 создает md5-хеш из содержимого нашего файла. func FileMD5(path string) string { h := md5.New() f, err := os.Open(path) if err != nil { panic(err) } defer f.Close() _, err = io.Copy(h, f) if err != nil { panic(err) } return fmt.Sprintf("%x", h.Sum(nil)) } |
3. Запустите код через go run checksum.go
в главном терминале;
4. Посмотрите на результат:
5. Создайте файл sha_panic.go
со следующим содержимым:
1 2 3 4 5 6 7 8 9 |
package main import ( "crypto" ) func main() { crypto.SHA1.New() } |
6. Запустите код через go run sha_panic.go
;
7. Посмотрите на результат в терминале:
Модуль crypto — Функции MD5() и Sha1()
Пакет crypto
содержит имплементации известных функций хеширования данных. MD5
хеш функция расположена в пакете crypto/md5
. Каждая хеш функция в пакете crypto
имплементирует интерфейс Hash
. Обратите внимание, что Hash
содержит метод Write
. С методом Write
он может использоваться как Writer
. Это видно в функции FileMD5
. Метод Sum
от Hash
принимает аргумент байтового среза, где должен находиться финальный хеш.
На заметку: Метод
Sum
не подсчитывает хеш аргумента, но рассчитывает на хеш в аргумент.
С другой стороны функция пакета md5.Sum
может использоваться для создания хеша напрямую. В данном случае аргумент функции Sum
является вычисленным из значений хеша.
Пакет crypto
имплементирует все варианты SHA
хеширования, а также другие хеш функции. Они обычно используются одинаково. К хеш функциям можно получить доступ через константу crypto.Hash
из пакета crypto
. К примеру, crypto.MD5.New()
. Однако в данном случае пакет с данной функцией должен быть связан со встроенным двоичным файлом (можно использовать пустой импорт import _ "crypto/md5"
), в противном случае вызов New
приведет к ошибке.
На заметку: Сам по себе пакет
hash
содержит CRC контрольные суммы и многое другое.
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»