PJW hash function

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

Other 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.[1]

Algorithm

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

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

Implementation

Below is the algorithm implementation used in UNIX ELF format:[3]

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;
}

See also

Non-cryptographic hash functions

References

  1. Binstock, Andrew (1996). "Hashing Rehashed". Dr. Dobb's.
  2. "Hash Functions". www.cs.hmc.edu. Retrieved 2015-06-10.
  3. CORPORATE UNIX Press. System V application binary interface. ISBN 0-13-100439-5.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.