РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1217 of 1593 menu

Интерфейс 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 для заданной таблицы
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить