Хэш-функция Фаулера – Нолла – Во
Фаулер-Нолл-Во (или FNV ) — это некриптографическая хеш-функция, созданная Гленном Фаулером, Лэндоном Куртом Ноллом и Кием-Фонг Во.
В основу алгоритма хеширования FNV была положена идея, отправленная в качестве рецензентских комментариев комитету IEEE POSIX P1003.2 Гленном Фаулером и Фонг Во в 1991 году. В последующем раунде голосования Лэндон Курт Нолл улучшил свой алгоритм. В электронном письме Лэндону они назвали его хешем Fowler/Noll/Vo или FNV. [ 1 ]
Обзор
[ редактировать ]Текущие версии — FNV-1 и FNV-1a, которые предоставляют средства создания ненулевой базы смещения FNV . ФНВ в настоящее время [ на момент? ] поставляется в 32-, 64-, 128-, 256-, 512- и 1024-битных вариантах. Для чистых реализаций FNV это определяется исключительно наличием простых чисел FNV для желаемой длины в битах; однако на веб-странице FNV обсуждаются методы адаптации одной из вышеупомянутых версий к меньшей длине, которая может быть степенью двойки, а может и не быть. [ 2 ] [ 3 ]
Алгоритмы хэширования FNV и исходный код FNV. [ 4 ] [ 5 ] были переданы в общественное достояние . [ 6 ]
Язык программирования Python ранее использовал модифицированную версию схемы FNV по умолчанию. hash
функция. Начиная с Python 3.4, FNV был заменен на SipHash для защиты от » с « хэш-наводнением » атак типа «отказ в обслуживании . [ 7 ]
FNV не является криптографическим хешем . [ 4 ]
Хэш
[ редактировать ]Одним из ключевых преимуществ FNV является простота реализации. Начните с начального значения хеш- функции смещения FNV . Для каждого входного байта умножьте хэш на простое число FNV , а затем выполните XOR с входным байтом. Альтернативный алгоритм FNV-1a меняет местами этапы умножения и XOR.
Хэш FNV-1
[ редактировать ]Алгоритм хеширования FNV-1 выглядит следующим образом: [ 8 ] [ 9 ]
algorithm fnv-1 is hash := FNV_offset_basis for each byte_of_data to be hashed do hash := hash × FNV_prime hash := hash XOR byte_of_data return hash
В приведенном выше псевдокоде все переменные являются без знака целыми числами . Все переменные, за исключением byte_of_data , имеют то же количество бит, что и хэш FNV. Переменная byte_of_data представляет собой 8- битное без знака целое число .
В качестве примера рассмотрим 64- битный хэш FNV-1:
- Все переменные, за исключением byte_of_data , представляют собой 64- битные без знака целые числа .
- Переменная byte_of_data представляет собой 8- битное без знака целое число .
- FNV_offset_basis — это 64- битное значение: 14695981039346656037 (в шестнадцатеричном формате 0xcbf29ce484222325).
- FNV_prime — это 64- битное значение 1099511628211 (в шестнадцатеричном формате 0x100000001b3).
- Умножение бита младшие 64 произведения возвращает .
- XOR — это 8- битная операция, которая изменяет только младшие 8 бит хеш-значения.
- битное целое Возвращаемое значение хеш-функции представляет собой 64- число знака без .
Хэш FNV-1a
[ редактировать ]Хэш FNV-1a отличается от хеша FNV-1 только порядком умножения и XOR : выполнения [ 8 ] [ 10 ]
algorithm fnv-1a is hash := FNV_offset_basis for each byte_of_data to be hashed do hash := hash XOR byte_of_data hash := hash × FNV_prime return hash
Вышеупомянутый псевдокод имеет те же предположения, которые были отмечены для псевдокода FNV-1. Изменение порядка приводит к несколько лучшим характеристикам лавины . [ 8 ] [ 11 ]
Хэш FNV-0 (устарел)
[ редактировать ]Хэш FNV-0 отличается от хеша FNV-1 только значением инициализации хэш- переменной: [ 8 ] [ 12 ]
algorithm fnv-0 is hash := 0 for each byte_of_data to be hashed do hash := hash × FNV_prime hash := hash XOR byte_of_data return hash
Вышеупомянутый псевдокод имеет те же предположения, которые были отмечены для псевдокода FNV-1.
Следствием инициализации хеша значением 0 является то, что пустые сообщения и все сообщения, состоящие только из байта 0, независимо от их длины, хэшируются до 0. [ 12 ]
Использование хеша FNV-0 устарело, за исключением расчета основы смещения FNV для использования в качестве параметров хеш-функции FNV-1 и FNV-1a. [ 8 ] [ 12 ]
База компенсации FNV
[ редактировать ]Существует несколько различных баз смещения FNV для различной длины бит. Эти базы смещения вычисляются путем вычисления FNV-0 из следующих 32 октетов , выраженных в ASCII :
chongo <Landon Curt Noll> /\../\
Это одна из Лэндона Курта Нолла фирменных фраз . Это единственное практическое применение устаревшего FNV-0. [ 8 ] [ 12 ]
ФНВ премьер
[ редактировать ]Простое число FNV является простым числом и определяется следующим образом: [ 4 ] [ 13 ]
Для данного целого числа s такого, что 4 < s < 11 , пусть n = 2 с и т знак равно ⌊ (5 + п ) / 12 ⌋ ; тогда n - битное простое число FNV — это наименьшее простое число p, имеющее вид
такой, что:
- 0 < б < 2 8 ,
- количество однобитов в двоичном представлении b равно 4 или 5, и
- р против (2 40 − 2 24 − 1) > 2 24 + 2 8 + 7 .
Экспериментально, простые числа FNV, соответствующие вышеуказанным ограничениям, имеют тенденцию иметь лучшие дисперсионные свойства. Они улучшают характеристику полиномиальной обратной связи, когда простое число FNV умножает промежуточное значение хеш-функции. Таким образом, полученные хеш-значения более разбросаны по n - битному хэш-пространству. [ 4 ] [ 13 ]
Хэш-параметры FNV
[ редактировать ]Вышеупомянутые основные ограничения FNV и определение базиса смещения FNV дают следующую таблицу параметров хеш-функции FNV:
Размер в битах
|
Представительство | ФНВ премьер | База компенсации FNV |
---|---|---|---|
32 | Выражение | 2 24 + 2 8 + 0x93 | |
Десятичный | 16777619 | 2166136261 | |
Шестнадцатеричный | 0x01000193 | 0x811c9dc5 | |
64 | Выражение | 2 40 + 2 8 + 0xb3 | |
Десятичный | 1099511628211 | 14695981039346656037 | |
Шестнадцатеричный | 0x00000100000001B3 | 0xcbf29ce484222325 | |
128 | Представительство | 2 88 + 2 8 + 0x3b | |
Десятичный | 309485009821345068724781371 | 144066263297769815596495629667062367629 | |
Шестнадцатеричный | 0x0000000001000000000000000000013B | 0x6c62272e07bb014262b821756295c58d | |
256 | Представительство | 2 168 + 2 8 + 0x63 | |
Десятичный |
374144419156711147060143317 |
100029257958052580907070968620625704837 | |
Шестнадцатеричный |
0x00000000000000000000010000000000 |
0xdd268dbcaac550362d98c384c4e576ccc8b153 | |
512 | Представительство | 2 344 + 2 8 + 0x57 | |
Десятичный |
358359158748448673689190764 |
965930312949666949800943540071631046609 | |
Шестнадцатеричный |
0x0000000000000000 0000000000000000 |
0xb86db0b1171f4416 dca1e50f309990ac | |
1024 | Представительство | 2 680 + 2 8 + 0x8d | |
Десятичный |
501645651011311865543459881103 |
14197795064947621068722070641403218320 | |
Шестнадцатеричный |
0x0000000000000000 0000000000000000 |
0x0000000000000000 005f7a76758ecc4d |
Некриптографический хэш
[ редактировать ]Хэш FNV был разработан для быстрого использования хеш-таблиц и контрольных сумм , а не криптографии . Авторы определили следующие свойства, делающие алгоритм непригодным в качестве криптографической хэш-функции : [ 15 ]
- Скорость вычислений . FNV-1 и FNV-1a, предназначенные в первую очередь для использования хеш-таблиц и контрольных сумм, были разработаны для быстрого вычисления. Однако эта же скорость позволяет быстрее находить конкретные значения хеш-функции (коллизии) методом грубой силы.
- Липкое состояние . Будучи итеративным хешем, основанным в основном на умножении и XOR, алгоритм чувствителен к нулевому числу. В частности, если бы значение хеш-функции стало нулевым в любой момент во время расчета, а следующий хешированный байт также был бы нулевым, то хеш-код не изменился бы. Это делает создание конфликтующих сообщений тривиальным, учитывая сообщение, которое в какой-то момент вычисления приводит к нулевому хеш-значению. Дополнительные операции, такие как добавление третьего постоянного простого числа на каждом этапе, могут смягчить это, но могут оказать пагубное влияние на лавинный эффект или случайное распределение хеш-значений.
- Распространение . Идеальная безопасная хеш-функция — это такая, в которой каждый входной байт оказывает одинаково сложное воздействие на каждый бит хеша. В хеше FNV единица (самый правый бит) всегда представляет собой XOR самого правого бита каждого входного байта. Это можно смягчить с помощью операции XOR (вычисление хэша в два раза больше желаемой длины, а затем выполнение XOR битов в «верхней половине» с битами в «нижней половине»). [ 4 ]
См. также
[ редактировать ]- Фильтр Блума (приложение для быстрых хэшей)
- Некриптографические хэш-функции
Ссылки
[ редактировать ]- ^ «FNV Hash — история хеша FNV» . www.isthe.com .
- ^ «FNV Hash — Изменение размера FNV хэша — xor-свертывание» . www.isthe.com .
- ^ «Хеш FNV — Изменение размера хеша FNV — не степени 2» . www.isthe.com .
- ^ Перейти обратно: а б с д и ж Истлейк, Дональд; Хансен, Тони; Фаулер, Гленн; Во, Ким-Фонг; Нолл, Лэндон. «Алгоритм некриптографического хеширования FNV» . www.tools.ietf.org .
- ^ «Хеш FNV — источник FNV» . www.isthe.com .
- ^ FNV вынесен в общественное достояние на isthe.com.
- ^ «PEP 456 — Безопасный и взаимозаменяемый алгоритм хеширования» . Python.org .
- ^ Перейти обратно: а б с д и ж Истлейк, Дональд; Хансен, Тони; Фаулер, Гленн; Во, Кием-Фонг; <unknown-email-Landon-Noll>, Лэндон Нолл (4 июня 2020 г.). «Алгоритм некриптографического хеширования FNV» . www.tools.ietf.org . Проверено 4 июня 2020 г.
{{cite web}}
:|last5=
имеет общее имя ( справка ) - ^ «FNV Hash — ядро хеша FNV» . www.isthe.com . Проверено 4 июня 2020 г.
- ^ «FNV Hash — альтернативный алгоритм FNV-1a» . www.isthe.com .
- ^ "лавина - мурмурхаш" . сайты.google.com .
- ^ Перейти обратно: а б с д «FNV Hash — FNV-0 Исторический нет» . www.isthe.com .
- ^ Перейти обратно: а б «FNV Hash — несколько замечаний о простых числах FNV» . www.isthe.com .
- ^ «Хеш FNV — Параметры хеша FNV-1/FNV-1a» . www.isthe.com .
- ^ Истлейк, Дональд; Хансен, Тони; Фаулер, Гленн; Во, Ким-Фонг; Нолл, Лэндон. «Алгоритм некриптографического хеширования FNV» . www.tools.ietf.org . Проверено 12 января 2021 г.
Внешние ссылки
[ редактировать ]- Веб-страница Лэндона Курта Нолла на FNV (с таблицей базовых и простых параметров)
- Интернет-проект Фаулера, Нолла, Во и Истлейка (информационный интернет-проект IETF)