Menu
Home Explore People Places Arts History Plants & Animals Science Life & Culture Technology
On this page
Fowler–Noll–Vo hash function
Non-cryptographic hash function

Fowler–Noll–Vo (FNV) is a non-cryptographic hash function developed by Glenn Fowler, Landon Curt Noll, and Kiem-Phong Vo. The algorithm originated from ideas submitted as reviewer comments to the IEEE POSIX P1003.2 committee in 1991 by Fowler and Vo, with Noll later enhancing the method. Named after its creators in an email exchange, the FNV hash is widely recognized for its simplicity and efficiency in hashing applications outside of cryptography.

We don't have any images related to Fowler–Noll–Vo hash function yet.
We don't have any YouTube videos related to Fowler–Noll–Vo hash function yet.
We don't have any PDF documents related to Fowler–Noll–Vo hash function yet.
We don't have any Books related to Fowler–Noll–Vo hash function yet.
We don't have any archived web articles related to Fowler–Noll–Vo hash function yet.

Overview

The current versions are FNV-1 and FNV-1a, which supply a means of creating non-zero FNV offset basis. FNV currently[as of?] comes in 32-, 64-, 128-, 256-, 512-, and 1024-bit variants. For pure FNV implementations, this is determined solely by the availability of FNV primes for the desired bit length; however, the FNV webpage discusses methods of adapting one of the above versions to a smaller length that may or may not be a power of two.23

The FNV hash algorithms and reference FNV source code45 have been released into the public domain.6

The Python programming language previously used a modified version of the FNV scheme for its default hash function. From Python 3.4, FNV has been replaced with SipHash to resist "hash flooding" denial-of-service attacks.7

FNV is not a cryptographic hash.8

The hash

One of FNV's key advantages is that it is very simple to implement.9 Start with an initial hash value of FNV offset basis. For each byte in the input, multiply hash by the FNV prime, then XOR it with the byte from the input. The alternate algorithm, FNV-1a, reverses the multiply and XOR steps.

FNV-1 hash

The FNV-1 hash algorithm is as follows:1011

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

In the above pseudocode, all variables are unsigned integers. All variables, except for byte_of_data, have the same number of bits as the FNV hash. The variable, byte_of_data, is an 8-bit unsigned integer.

As an example, consider the 64-bit FNV-1 hash:

  • All variables, except for byte_of_data, are 64-bit unsigned integers.
  • The variable, byte_of_data, is an 8-bit unsigned integer.
  • The FNV_offset_basis is the 64-bit value: 14695981039346656037 (in hex, 0xcbf29ce484222325).
  • The FNV_prime is the 64-bit value 1099511628211 (in hex, 0x100000001b3).
  • The multiply returns the lower 64 bits of the product.
  • The XOR is an 8-bit operation that modifies only the lower 8-bits of the hash value.
  • The hash value returned is a 64-bit unsigned integer.

FNV-1a hash

The FNV-1a hash differs from the FNV-1 hash only by the order in which the multiply and XOR is performed:1213

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

The above pseudocode has the same assumptions that were noted for the FNV-1 pseudocode. The change in order leads to slightly better avalanche characteristics.1415

FNV-0 hash (deprecated)

The FNV-0 hash differs from the FNV-1 hash only by the initialisation value of the hash variable:1617

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

The above pseudocode has the same assumptions that were noted for the FNV-1 pseudocode.

A consequence of the initialisation of the hash to 0 is that empty messages and all messages consisting of only the byte 0, regardless of their length, hash to 0.18

Use of the FNV-0 hash is deprecated except for the computing of the FNV offset basis for use as the FNV-1 and FNV-1a hash parameters.1920

FNV offset basis

There are several different FNV offset bases for various bit lengths. These offset bases are computed by computing the FNV-0 from the following 32 octets when expressed in ASCII:

chongo <Landon Curt Noll> /\../\

This is one of Landon Curt Noll's signature lines. This is the only current practical use for the deprecated FNV-0.2122

FNV prime

An FNV prime is a prime number and is determined as follows:2324

For a given integer s such that 4 < s < 11, let n = 2s and t = ⌊(5 + n) / 12⌋; then the n-bit FNV prime is the smallest prime number p that is of the form

256 t + 2 8 + b {\displaystyle 256^{t}+2^{8}+\mathrm {b} \,}

such that:

  • 0 < b < 28,
  • the number of one-bits in the binary representation of b is either 4 or 5, and
  • p mod (240 − 224 − 1) > 224 + 28 + 27.

Experimentally, FNV primes matching the above constraints tend to have better dispersion properties. They improve the polynomial feedback characteristic when an FNV prime multiplies an intermediate hash value. As such, the hash values produced are more scattered throughout the n-bit hash space.2526

FNV hash parameters

The above FNV prime constraints and the definition of the FNV offset basis yield the following table of FNV hash parameters:

FNV parameters 2728
Size in bits

n = 2 s {\displaystyle n=2^{s}}

RepresentationFNV primeFNV offset basis
32Expression224 + 28 + 0x93
Decimal167776192166136261
Hexadecimal0x010001930x811c9dc5
64Expression240 + 28 + 0xb3
Decimal109951162821114695981039346656037
Hexadecimal0x00000100000001b30xcbf29ce484222325
128Representation288 + 28 + 0x3b
Decimal309485009821345068724781371144066263297769815596495629667062367629
Hexadecimal0x0000000001000000000000000000013b0x6c62272e07bb014262b821756295c58d
256Representation2168 + 28 + 0x63
Decimal

374144419156711147060143317175368453031918731002211

100029257958052580907070968620625704837092796014241193945225284501741471925557

Hexadecimal

0x0000000000000000000001000000000000000000000000000000000000000163

0xdd268dbcaac550362d98c384c4e576ccc8b1536847b6bbb31023b4c8caee0535

512Representation2344 + 28 + 0x57
Decimal

35835915874844867368919076489095108449946327955754392558399825615420669938882575126094039892345713852759

9659303129496669498009435400716310466090418745672637896108374329434462657994582932197716438449813051892206539805784495328239340083876191928701583869517785

Hexadecimal

0x0000000000000000 00000000000000000000000001000000 00000000000000000000000000000000 00000000000000000000000000000000 0000000000000157

0xb86db0b1171f4416 dca1e50f309990acac87d059c9000000 0000000000000d21e948f68a34c192f6 2ea79bc942dbe7ce182036415f56e34b ac982aac4afe9fd9

1024Representation2680 + 28 + 0x8d
Decimal

5016456510113118655434598811035278955030765345404790744303017523831112055108147451509157692220295382716162651878526895249385292291816524375083746691371804094271873160484737966720260389217684476157468082573

14197795064947621068722070641403218320880622795441933960878474914617582723252296732303717722150864096521202355549365628174669108571814760471015076148029755969804077320157692458563003215304957150157403644460363550505412711285966361610267868082893823963790439336411086884584107735010676915

Hexadecimal

0x0000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000100000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000000018d

0x0000000000000000 005f7a76758ecc4d32e56d5a591028b7 4b29fc4223fdada16c3bf34eda3674da 9a21d900000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000000000004c6d7eb6e73802734510a 555f256cc005ae556bde8cc9c6a93b21 aff4b16c71ee90b3

Non-cryptographic hash

The FNV hash was designed for fast hash table and checksum use, not cryptography. The authors have identified the following properties as making the algorithm unsuitable as a cryptographic hash function:29

  • Speed of computation – As a hash designed primarily for hashtable and checksum use, FNV-1 and FNV-1a were designed to be fast to compute. However, this same speed makes finding specific hash values (collisions) by brute force faster.
  • Sticky state – Being an iterative hash based primarily on multiplication and XOR, the algorithm is sensitive to the number zero. Specifically, if the hash value were to become zero at any point during calculation, and the next byte hashed were also all zeroes, then the hash would not change. This makes colliding messages trivial to create given a message that results in a hash value of zero at some point in its calculation. Additional operations, such as the addition of a third constant prime on each step, can mitigate this but may have detrimental effects on avalanche effect or random distribution of hash values.
  • Diffusion – The ideal secure hash function is one in which each byte of input has an equally-complex effect on every bit of the hash. In the FNV hash, the ones place (the rightmost bit) is always the XOR of the rightmost bit of every input byte. This can be mitigated by XOR-folding (computing a hash twice the desired length, and then XORing the bits in the "upper half" with the bits in the "lower half").30

A structural weakness of FNV-1a arises from its use of XOR before multiplication, which can cause predictable relationships between hashes of related inputs. For example, the following identity holds in both the 32-bit and 64-bit variants:

fnv1a("some-string-a") XOR fnv1a("some-id-1231") = fnv1a("some-string-b") XOR fnv1a("some-id-1232")

because the differing characters ('a' vs 'b', and '1' vs '2') differ by the same bit pattern. This illustrates how certain bitwise symmetries in input can lead to unintended hash correlations. XOR-folding does not remove this weakness.

See also

References

  1. "FNV Hash - FNV hash history". www.isthe.com. http://www.isthe.com/chongo/tech/comp/fnv/index.html#history

  2. "FNV Hash - Changing the FNV hash size - xor-folding". www.isthe.com. http://www.isthe.com/chongo/tech/comp/fnv/index.html#xor-fold

  3. "FNV Hash - Changing the FNV hash size - non-powers of 2". www.isthe.com. http://www.isthe.com/chongo/tech/comp/fnv/index.html#other-folding

  4. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; Noll, Landon (29 May 2019). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. https://tools.ietf.org/html/draft-eastlake-fnv-17.html

  5. "FNV Hash - FNV source". www.isthe.com. http://www.isthe.com/chongo/tech/comp/fnv/index.html#FNV-source

  6. FNV put into the public domain on isthe.com http://www.isthe.com/chongo/tech/comp/fnv/index.html#public_domain

  7. "PEP 456 -- Secure and interchangeable hash algorithm". Python.org. https://www.python.org/dev/peps/pep-0456/

  8. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; Noll, Landon (29 May 2019). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. https://tools.ietf.org/html/draft-eastlake-fnv-17.html

  9. Smith, James (2022-05-29). "Hash Functions in Go". Golang Project Structure. Retrieved 2024-10-19. https://golangprojectstructure.com/hash-functions-go-code/#implementing-the-fowler%e2%80%93noll%e2%80%93vo-fnv-hash-function

  10. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; , Landon Noll (June 4, 2020). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. Retrieved 2020-06-04. {{cite journal}}: |last5= has generic name (help) https://tools.ietf.org/html/draft-eastlake-fnv-17.html

  11. "FNV Hash - The core of the FNV hash". www.isthe.com. Retrieved 2020-06-04. http://www.isthe.com/chongo/tech/comp/fnv/index.html#FNV-1

  12. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; , Landon Noll (June 4, 2020). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. Retrieved 2020-06-04. {{cite journal}}: |last5= has generic name (help) https://tools.ietf.org/html/draft-eastlake-fnv-17.html

  13. "FNV Hash - FNV-1a alternate algorithm". www.isthe.com. http://www.isthe.com/chongo/tech/comp/fnv/index.html#FNV-1a

  14. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; , Landon Noll (June 4, 2020). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. Retrieved 2020-06-04. {{cite journal}}: |last5= has generic name (help) https://tools.ietf.org/html/draft-eastlake-fnv-17.html

  15. "avalanche - murmurhash". sites.google.com. https://sites.google.com/site/murmurhash/avalanche

  16. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; , Landon Noll (June 4, 2020). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. Retrieved 2020-06-04. {{cite journal}}: |last5= has generic name (help) https://tools.ietf.org/html/draft-eastlake-fnv-17.html

  17. "FNV Hash - FNV-0 Historic not". www.isthe.com. http://www.isthe.com/chongo/tech/comp/fnv/index.html#FNV-0

  18. "FNV Hash - FNV-0 Historic not". www.isthe.com. http://www.isthe.com/chongo/tech/comp/fnv/index.html#FNV-0

  19. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; , Landon Noll (June 4, 2020). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. Retrieved 2020-06-04. {{cite journal}}: |last5= has generic name (help) https://tools.ietf.org/html/draft-eastlake-fnv-17.html

  20. "FNV Hash - FNV-0 Historic not". www.isthe.com. http://www.isthe.com/chongo/tech/comp/fnv/index.html#FNV-0

  21. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; , Landon Noll (June 4, 2020). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. Retrieved 2020-06-04. {{cite journal}}: |last5= has generic name (help) https://tools.ietf.org/html/draft-eastlake-fnv-17.html

  22. "FNV Hash - FNV-0 Historic not". www.isthe.com. http://www.isthe.com/chongo/tech/comp/fnv/index.html#FNV-0

  23. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; Noll, Landon (29 May 2019). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. https://tools.ietf.org/html/draft-eastlake-fnv-17.html

  24. "FNV Hash - A few remarks on FNV primes". www.isthe.com. http://www.isthe.com/chongo/tech/comp/fnv/index.html#fnv-prime

  25. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; Noll, Landon (29 May 2019). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. https://tools.ietf.org/html/draft-eastlake-fnv-17.html

  26. "FNV Hash - A few remarks on FNV primes". www.isthe.com. http://www.isthe.com/chongo/tech/comp/fnv/index.html#fnv-prime

  27. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; Noll, Landon (29 May 2019). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. https://tools.ietf.org/html/draft-eastlake-fnv-17.html

  28. "FNV Hash - Parameters of the FNV-1/FNV-1a hash". www.isthe.com. http://www.isthe.com/chongo/tech/comp/fnv/index.html#FNV-param

  29. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; Noll, Landon (29 May 2019). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. Retrieved 2021-01-12. https://tools.ietf.org/html/draft-eastlake-fnv-17.html

  30. Eastlake, Donald; Hansen, Tony; Fowler, Glenn; Vo, Kiem-Phong; Noll, Landon (29 May 2019). "The FNV Non-Cryptographic Hash Algorithm". tools.ietf.org. https://tools.ietf.org/html/draft-eastlake-fnv-17.html