Ответ
В Go выбор хэширующей функции зависит от конкретной задачи. Стандартная библиотека предоставляет богатый набор инструментов в пакетах hash
и crypto
.
Основные типы хэш-функций в Go
Не криптографические (для скорости и целостности данных)
hash/crc32
,hash/crc64
: Используются для вычисления контрольных сумм (checksums). Идеальны для проверки целостности файлов при передаче или хранении. Очень быстрые, но не подходят для задач безопасности.hash/fnv
: Быстрая не криптографическая хэш-функция. Хорошо подходит для хэш-таблиц или других структур данных, где важна скорость, а не защита от коллизий.
Криптографические (для безопасности)
crypto/sha1
,crypto/sha256
,crypto/sha512
: Семейство безопасных алгоритмов хэширования. Используются для проверки подлинности данных, хранения паролей (с солью), создания цифровых подписей. SHA-256 является текущим стандартом для большинства задач.crypto/md5
: Считается устаревшим и небезопасным для криптографических целей из-за уязвимостей к коллизиям, но все еще может использоваться для проверки целостности файлов, где безопасность не является приоритетом.
Специальный случай: хэширование в
map
- Для встроенного типа
map
Go использует собственную, очень быструю хэш-функцию. Её реализация не экспортируется и может меняться между версиями Go, в том числе для защиты от атак типа "hash-flooding" (DoS-атаки, использующие коллизии).
- Для встроенного типа
Пример выбора и использования
import (
"crypto/sha256"
"fmt"
"hash/crc32"
)
func main() {
// Задача: Проверить целостность данных
data := []byte("some important data")
crc32q := crc32.MakeTable(0xD5828281)
checksum := crc32.Checksum(data, crc32q)
fmt.Printf("CRC32 Checksum: %xn", checksum)
// Задача: Безопасно захэшировать пароль (в реальном приложении нужна соль!)
secret := []byte("super_secret_password")
hash := sha256.Sum256(secret)
fmt.Printf("SHA256 Hash: %xn", hash)
}
Критерии выбора (кратко)
- Целостность данных? →
crc32
- Нужна скорость для структур данных (не безопасность)? →
fnv
- Нужна безопасность (пароли, подписи)? →
sha256
,sha512