Fowler – Noll – Vo hashovací funkce - Fowler–Noll–Vo hash function
Fowler – Noll – Vo je ne-kryptografické hashovací funkce vytvořil Glenn Fowler, Landon Curt Noll a Kiem-Phong Vo.
Základ hashového algoritmu FNV byl převzat z nápadu zaslaného jako komentáře recenzenta IEEE POSIX P1003.2 výbor Glenna Fowlera a Phong Vo v roce 1991. V následujícím kole hlasování vylepšil Landon Curt Noll svůj algoritmus. V e-mailové zprávě Landonovi to pojmenovali Fowler / Noll / Vo nebo FNV hash.[1]
Přehled
Aktuální verze jsou FNV-1 a FNV-1a, které dodávají prostředky k vytváření nenulové hodnoty Základ offsetu FNV. FNV v současné době přichází v 32-, 64-, 128-, 256-, 512- a 1024-bitových variantách. U čistých implementací FNV je to určeno pouze dostupností FNV prvočísla pro požadovanou délku bitu; webová stránka FNV však popisuje způsoby přizpůsobení jedné z výše uvedených verzí na menší délku, která může nebo nemusí být mocninou dvou.[2][3]
Algoritmy hash FNV a referenční FNV zdrojový kód[4][5] byly propuštěny do veřejná doména.[6]
Po mnoho let Programovací jazyk Python použil pro své výchozí nastavení mírně upravenou verzi hash FNV hash
funkce.[7] To bylo změněno v Pythonu 3.4 za účelem ochrany před DoS útoky na aplikace Pythonu.
FNV není kryptografický hash.[8]
Hash
Jednou z klíčových výhod FNV je, že je jeho implementace velmi jednoduchá. Začněte s počáteční hashovací hodnotou Základ offsetu FNV. Pro každý bajt na vstupu násobit hash podle FNV prime, pak XOR to s bajtem ze vstupu. Alternativní algoritmus FNV-1a obrací kroky násobení a XOR.
FNV-1 hash
Algoritmus hash FNV-1 je následující:[9][10]
algoritmus fnv-1 je hash := FNV_offset_basis pro každého byte_of_data být hašován dělat hash := hash × FNV_prime hash := hash XOR byte_of_data vrátit se hash
Ve výše uvedeném pseudo kód, všechny proměnné jsou nepodepsaný celá čísla. Všechny proměnné, kromě byte_of_data, mají stejný počet bity jako hash FNV. Proměnná, byte_of_data, je 8 bit nepodepsaný celé číslo.
Jako příklad zvažte 64-bit FNV-1 hash:
- Všechny proměnné, kromě byte_of_data, jsou 64-bit nepodepsaný celá čísla.
- Proměnná, byte_of_data, je 8-bit nepodepsaný celé číslo.
- The FNV_offset_basis je 64-bit Základ offsetu FNV hodnota: 14695981039346656037 (v hexadecimálním formátu, 0xcbf29ce484222325).
- The FNV_prime je 64-bit FNV prime hodnota: 1099511628211 (v hexadecimálním formátu, 0x100000001b3).
- The násobit vrací spodní 64-bity z produkt.
- The XOR je 8-bit operace, která upravuje pouze spodní 8-bity hash hodnoty.
- The hash vrácená hodnota je 64-bit nepodepsaný celé číslo.
FNV-1a hash
Hash FNV-1a se liší od hash FNV-1 pouze v pořadí, ve kterém násobit a XOR se provádí:[9][11]
algoritmus fnv-1a je hash := FNV_offset_basis pro každého byte_of_data být hašován dělat hash := hash XOR byte_of_data hash := hash × FNV_prime vrátit se hash
Výše pseudo kód má stejné předpoklady, jaké byly zaznamenány u FNV-1 pseudo kód. Změna pořadí vede k mírně lepšímu lavinové vlastnosti.[9][12]
FNV-0 hash (zastaralé)
Hash FNV-0 se liší od hash FNV-1 pouze inicializační hodnotou hash proměnná:[9][13]
algoritmus fnv-0 je hash := 0 pro každého byte_of_data být hašován dělat hash := hash × FNV_prime hash := hash XOR byte_of_data vrátit se hash
Výše pseudo kód má stejné předpoklady, jaké byly zaznamenány u FNV-1 pseudo kód.
Použití hash FNV-0 je zastaralé s výjimkou výpočtu Základ offsetu FNV pro použití jako hash parametry FNV-1 a FNV-1a.[9][13]
Základ offsetu FNV
Existuje několik různých Základ offsetu FNV pro různé délky bitů. Tyto Základ offsetu FNV jsou počítány výpočtem FNV-0 z následujících 32 oktety když je vyjádřeno v ASCII:
chongo
/ ../
který je jedním z Landon Curt Noll je podpisové řádky. Toto je jediné současné praktické použití pro zastaralé FNV-0.[9][13]
FNV prime
An FNV prime je prvočíslo a je stanovena takto:[14][15]
Za dané :
- (tj. s je celé číslo )
kde je:
a kde je:
- POZNÁMKA: je funkce podlahy
pak n-bit FNV prime je nejmenší prvočíslo ve tvaru:
takové, že:
- Počet jednobitů v binární číslo zastoupení je 4 nebo 5
Experimentálně, FNV prime shoda s výše uvedenými omezeními má tendenci mít lepší disperzní vlastnosti. Zlepšují charakteristiku polynomiální zpětné vazby, když FNV prime vynásobí střední hodnotu hash. Vyrobené hodnoty hash jsou proto více rozptýleny po celém souboru n-bit hash prostor.[14][15]
Parametry hash FNV
Výše FNV prime omezení a definice Základ offsetu FNV výtěžek následující tabulky hash parametrů FNV:
Velikost v bitech | Zastoupení | FNV prime | Základ offsetu FNV |
---|---|---|---|
32 | Výraz | 224 + 28 + 0x93 | |
Desetinný | 16777619 | 2166136261 | |
Hexadecimální | 0x01000193 | 0x811c9dc5 | |
64 | Výraz | 240 + 28 + 0xb3 | |
Desetinný | 1099511628211 | 14695981039346656037 | |
Hexadecimální | 0x00000100000001B3 | 0xcbf29ce484222325 | |
128 | Zastoupení | 288 + 28 + 0x3b | |
Desetinný | 309485009821345068724781371 | 144066263297769815596495629667062367629 | |
Hexadecimální | 0x0000000001000000000000000000013B | 0x6c62272e07bb014262b821756295c58d | |
256 | Zastoupení | 2168 + 28 + 0x63 | |
Desetinný | 374144419156711147060143317 | 100029257958052580907070968620625704837 | |
Hexadecimální | 0x00000000000000000000010000000000 | 0xdd268dbcaac550362d98c384c4e576ccc8b153 | |
512 | Zastoupení | 2344 + 28 + 0x57 | |
Desetinný | 358359158748448673689190764 | 965930312949666949800943540071631046609 | |
Hexadecimální | 0x0000000000000000 0000000000000000 | 0xb86db0b1171f4416 dca1e50f309990ac | |
1024 | Zastoupení | 2680 + 28 + 0x8d | |
Desetinný | 501645651011311865543459881103 | 14197795064947621068722070641403218320 | |
Hexadecimální | 0x0000000000000000 0000000000000000 | 0x0000000000000000 005f7a76758ecc4d |
Nekryptografický hash
FNV hash byl navržen pro rychlé hash tabulka a kontrolní součet používat, ne kryptografie. Autoři identifikovali následující vlastnosti, díky nimž je algoritmus nevhodný jako a kryptografická hashovací funkce:[8]
- Rychlost výpočtu - Jako hash určený primárně pro použití hashtable a kontrolního součtu byly FNV-1 a FNV-1a navrženy tak, aby byly rychle vypočítatelné. Stejná rychlost však umožňuje rychlejší nalezení konkrétních hodnot hash (kolizí) hrubou silou.
- Sticky State - Protože jde o iterativní hash založený primárně na násobení a XOR, je algoritmus citlivý na číslo nula. Konkrétně, pokud by se hodnota hash měla kdykoli během výpočtu stát nulou a další hašovaný bajt byly také všechny nuly, hash by se nezměnil. Díky tomu jsou kolizní zprávy triviální k vytvoření dané zprávy, která má v určitém bodě výpočtu za následek nulovou hodnotu nula. Další operace, jako je přidání třetí konstantní prime v každém kroku, to mohou zmírnit, ale mohou mít škodlivé účinky na lavinový efekt nebo náhodné rozdělení hodnot hash.
- Difúze - Ideální zabezpečená hashovací funkce je funkce, při které má každý bajt vstupu stejně složitý účinek na každý bit hash. V hash FNV je místo těch (bit zcela vpravo) vždy XOR bitu nejvíce vpravo každého vstupního bajtu. To lze zmírnit pomocí XOR-foldingu (výpočet hash s dvojnásobnou požadovanou délkou a poté XOR bitů v „horní polovině“ s bity ve „spodní polovině“).[18]
Viz také
- Bloomův filtr (aplikace pro rychlé hashování)
- Nekryptografické hashovací funkce
Reference
- ^ Historie hash FNV
- ^ Změna velikosti hash FNV - skládání xor
- ^ Změna velikosti hash FNV - non-pravomoci 2
- ^ Zdrojový kód
- ^ Zdroj FNV
- ^ FNV zveřejněno na isthe.com
- ^ [1]
- ^ A b Proč je FNV nekryptografický?
- ^ A b C d E F Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong;
, Landon Noll (4. června 2020). „FNV nekryptografický hashovací algoritmus“. tools.ietf.org. Citováno 2020-06-04. - ^ „FNV Hash“. www.isthe.com. Citováno 2020-06-04.
- ^ Alternativní algoritmus FNV-1a
- ^ Lavina
- ^ A b C FNV-0 historická nota
- ^ A b FNV připravuje
- ^ A b Několik poznámek k prvočíslím FNV
- ^ Konstanty FNV
- ^ Parametry hash FNV
- ^ Další velikosti hash a XOR skládání
externí odkazy
- Webová stránka Landona Curta Nolla na FNV (s tabulkou základních a hlavních parametrů)
- Internetový koncept Fowlera, Nolla, Voa a Eastlaka (Informační internetový koncept IETF)