Интерфейс hash.Hash
Интерфейс hash.Hash из пакета crypto предоставляет
общий способ вычисления хеш-суммы для различных алгоритмов,
таких как MD5, SHA-1, SHA-256 и других. Он реализует интерфейс
io.Writer, что позволяет записывать данные через
Write, а затем получать итоговый хеш через метод
Sum. Метод Reset возвращает хеш в исходное
состояние для повторного использования, а метод Size
возвращает длину хеша в байтах.
Синтаксис
type Hash interface {
io.Writer
Sum(b []byte) []byte
Reset()
Size() int
BlockSize() int
}
Метод Write
Метод Write добавляет данные в хеш. Он возвращает
количество записанных байт и ошибку. Этот метод реализует
интерфейс io.Writer, поэтому хеш можно использовать
с функциями, которые работают с io.Writer.
Метод Sum
Метод Sum возвращает текущее хеш-значение в виде
среза байт. Если передать существующий срез, он будет
использован как основа для результата. Обычно передают
nil, чтобы получить новый срез.
Метод Reset
Метод Reset сбрасывает состояние хеша, позволяя
повторно использовать тот же объект для вычисления нового
хеша без создания нового экземпляра.
Метод Size
Метод Size возвращает длину хеша в байтах.
Например, для SHA-256 это 32 байта, а для SHA-1 — 20 байт.
Пример использования SHA-256
Давайте вычислим хеш SHA-256 для строки "hello world":
package main
import (
"crypto/sha256"
"fmt"
)
func main() {
h := sha256.New()
h.Write([]byte("hello world"))
res := h.Sum(nil)
fmt.Printf("%x\n", res)
}
Результат выполнения кода:
"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
Пример с несколькими Write
Метод Write можно вызывать несколько раз для
постепенной обработки данных:
package main
import (
"crypto/sha256"
"fmt"
)
func main() {
h := sha256.New()
h.Write([]byte("hello "))
h.Write([]byte("world"))
res := h.Sum(nil)
fmt.Printf("%x\n", res)
}
Результат выполнения кода:
"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
Пример с Reset
С помощью метода Reset можно переиспользовать
объект хеша для вычисления нового значения:
package main
import (
"crypto/sha256"
"fmt"
)
func main() {
h := sha256.New()
h.Write([]byte("first"))
res1 := h.Sum(nil)
h.Reset()
h.Write([]byte("second"))
res2 := h.Sum(nil)
fmt.Printf("%x\n", res1)
fmt.Printf("%x\n", res2)
}
Результат выполнения кода:
"8c080f02f1ee04caf527152140c02de23e0118f3b96044993e10a4721ec6b47f"
"60b2518fa748b2c46b3a42a5a8ff232cd6c87f0137e6ad05bbbe8119d06f0017"
Пример с MD5
Интерфейс hash.Hash используется всеми хеш-функциями
в пакете crypto. Вот пример с MD5:
package main
import (
"crypto/md5"
"fmt"
)
func main() {
h := md5.New()
h.Write([]byte("hello world"))
res := h.Sum(nil)
fmt.Printf("%x\n", res)
}
Результат выполнения кода:
"5eb63bbbe01eeed093cb22bb8f5acdc3"
Смотрите также
-
интерфейс
hash.Hash32,
который вычисляет 32-битные хеш-суммы -
интерфейс
hash.Hash64,
который вычисляет 64-битные хеш-суммы -
функцию
md5.New,
которая создает новый хеш MD5 -
функцию
sha256.New,
которая создает новый хеш SHA-256