Интерфейс hash.Hash64
Интерфейс hash.Hash64 предназначен для вычисления 64-битных
хеш-сумм. Он включает все методы базового интерфейса
hash.Hash и добавляет метод Sum64, который
возвращает хеш в виде 64-битного целого числа без знака.
Этот интерфейс удобно использовать с алгоритмами хеширования,
которые генерируют 64-битные хеши, например, FNV-64 или CRC-64.
Синтаксис
type Hash64 interface {
hash.Hash
Sum64() uint64
}
Интерфейс hash.Hash64 объединяет стандартный интерфейс
хеша и метод Sum64, который возвращает итоговое
64-битное значение.
Пример использования с FNV-64
Создадим хеш FNV-64 с помощью функции fnv.New64,
запишем в него строку и получим 64-битный хеш:
package main
import (
"fmt"
"hash/fnv"
)
func main() {
h := fnv.New64()
h.Write([]byte("hello world"))
res := h.Sum64()
fmt.Println(res)
}
Результат выполнения кода:
15390171016868245922
Пример использования с FNV-64a
Алгоритм FNV-64a также реализует интерфейс hash.Hash64.
Используем функцию fnv.New64a для создания хеша:
package main
import (
"fmt"
"hash/fnv"
)
func main() {
h := fnv.New64a()
h.Write([]byte("hello world"))
res := h.Sum64()
fmt.Println(res)
}
Результат выполнения кода:
15263374897754137074
Пример с хешированием нескольких фрагментов данных
Метод Write можно вызывать несколько раз для разных
частей данных, а затем получить итоговый хеш:
package main
import (
"fmt"
"hash/fnv"
)
func main() {
h := fnv.New64()
h.Write([]byte("hello"))
h.Write([]byte(" "))
h.Write([]byte("world"))
res := h.Sum64()
fmt.Println(res)
}
Результат выполнения кода:
15390171016868245922
Обратите внимание, что результат совпадает с результатом хеширования строки "hello world" целиком, так как хеш-функция обрабатывает все переданные данные как единый поток.
Пример с CRC-64
Пакет crc64 также предоставляет реализацию
hash.Hash64. Создадим хеш CRC-64 с таблицей
ECMA и вычислим 64-битный хеш:
package main
import (
"fmt"
"hash/crc64"
)
func main() {
table := crc64.MakeTable(crc64.ECMA)
h := crc64.New(table)
h.Write([]byte("hello world"))
res := h.Sum64()
fmt.Println(res)
}
Результат выполнения кода:
15715793865936234776
Метод Sum64 в сравнении с Sum
В отличие от метода Sum, который возвращает срез байт,
метод Sum64 возвращает число типа uint64,
что удобно для числовых сравнений и использования в качестве
ключей в структурах данных:
package main
import (
"fmt"
"hash/fnv"
)
func main() {
h := fnv.New64()
h.Write([]byte("hello world"))
res64 := h.Sum64()
resBytes := h.Sum(nil)
fmt.Printf("Sum64: %d\n", res64)
fmt.Printf("Sum: %v\n", resBytes)
}
Результат выполнения кода:
"Sum64: 15390171016868245922"
"Sum: [213 253 109 26 42 186 222 201]"
Смотрите также
-
интерфейс
hash.Hash,
базовый интерфейс для всех хеш-функций -
интерфейс
hash.Hash32,
для вычисления 32-битных хеш-сумм -
функцию
fnv.New64,
создающую хеш FNV-64 -
функцию
crc64.New,
создающую хеш CRC-64 для заданной таблицы