Reference articles on history, science, culture and more
Encyclopedia

PJW hash function

Computing algorithm

PJW hash function is a non-cryptographic hash function created by Peter J. Weinberger of AT&T Bell Labs.

01Other versions

A variant of PJW hash had been used to create ElfHash or Elf64 hash that is used in Unix object files with ELF format.

Allen Holub has created a portable version of PJW hash algorithm that had a bug and ended up in several textbooks, as the author of one of these textbooks later admitted.

02Algorithm

PJW hash algorithm involves shifting the previous hash and adding the current byte followed by moving the high bits:

algorithm PJW_hash(s) is uint h := 0 bits := uint size in bits for i := 1 to |S| do h := h << bits/8 + s[i] high := get top bits/8 bits of h from left if high ≠ 0 then h := h xor (high >> bits * 3/4) h := h & ~high return h

03Implementation

Below is the algorithm implementation used in Unix ELF format:

unsigned long ElfHash(const unsigned char *s) { unsigned long h = 0, high; while (*s) { h = (h << 4) + *s++; if (high = h & 0xF0000000) h ^= high >> 24; h &= ~high; } return h; }

This C code incorrectly assumes that long is a 32-bit data type. When long is wider than 32 bits, as it is on many 64-bit systems, the code contains a bug.

Watch videos about PJW hash functionExplainers and documentaries on YouTube (opens in a new tab)

Sources and credits

This article is adapted from the Wikipedia article PJW hash function, written by its contributors and licensed under CC BY-SA 4.0. Fathomly has changed the layout, removed citation markers, navigation and maintenance notices, and adjusted punctuation. This adapted version is shared under the same license. For references, see the original article.

Fathomly is not affiliated with or endorsed by the Wikimedia Foundation. Spotted a problem? Tell us.