Fowler/Noll/Vo hash algorhythm : Hash Code « Development Class « Java






Fowler/Noll/Vo hash algorhythm

      

/*
 * Copyright 2008-2010 the T2 Project ant the Others.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
//package org.t2framework.commons.util;

/**
 * Fowler/Noll/Vo hash algorhythm.
 * 
 * This one is originally from http://www.isthe.com/chongo/tech/comp/fnv, and is
 * taken from project voldemort.
 * 
 * The basic theory is:
 * 
 * <pre>
 * hash = basis
 * for each octet_of_data to be hashed 
 *   hash = hash * FNV_prime 
 *   hash = hash xor octet_of_data 
 * return hash
 * </pre>
 * 
 * @see http://www.isthe.com/chongo/tech/comp/fnv
 * @see http://www.isthe.com/chongo/tech/comp/fnv/#FNV-param
 * 
 */
public class FnvHashFunction extends AbstractHashFunction {

  private static final long FNV_BASIS = 0x811c9dc5;

  // for 32bit
  private static final long FNV_PRIME = (1 << 24) + 0x193;

  public int hash(byte[] bytes, int length, int initval) {
    long hash = FNV_BASIS;
    for (int i = 0; i < bytes.length; i++) {
      hash ^= 0xFF & bytes[i];
      hash *= FNV_PRIME;
    }
    return (int) hash;
  }

}
abstract class AbstractHashFunction implements HashFunction {

  public int hash(byte[] bytes, int initval) {
    return hash(bytes, bytes.length, initval);
  }

  public int hash(byte[] bytes) {
    return hash(bytes, bytes.length, -1);
  }

}
interface HashFunction {

  int hash(byte[] bytes);

  int hash(byte[] bytes, int initval);

  int hash(byte[] bytes, int length, int initval);
}

---------------
package org.t2framework.commons.util;

import junit.framework.TestCase;

public class FnvHashFunctionTest extends TestCase {

  public void test1() throws Exception {
    FnvHashFunction fnv = new FnvHashFunction();
    int numIterations = 1000000;
    int numBuckets = 5;
    int[] buckets = new int[numBuckets];
    long start = System.currentTimeMillis();
    for (int i = 0; i < numIterations; i++) {
      int val = fnv.hash(Integer.toString(i).getBytes());
      buckets[Math.abs(val) % numBuckets] += 1;
    }
    System.out.println(System.currentTimeMillis() - start);

    double expected = numIterations / (double) numBuckets;
    for (int i = 0; i < numBuckets; i++) {
      System.out.println(i + " " + buckets[i] + " "
          + (buckets[i] / expected));
    }

  }

  public void test2() throws Exception {
    MurmurHashFunction mur = new MurmurHashFunction();
    int numIterations = 1000000;
    int numBuckets = 5;
    int[] buckets = new int[numBuckets];
    long start = System.currentTimeMillis();
    for (int i = 0; i < numIterations; i++) {
      int val = mur.hash(Integer.toString(i).getBytes());
      buckets[Math.abs(val) % numBuckets] += 1;
    }
    System.out.println(System.currentTimeMillis() - start);

    double expected = numIterations / (double) numBuckets;
    for (int i = 0; i < numBuckets; i++) {
      System.out.println(i + " " + buckets[i] + " "
          + (buckets[i] / expected));
    }
  }

  public void test3() throws Exception {
    JenkinsHashFunction jenkins = new JenkinsHashFunction();
    int numIterations = 1000000;
    int numBuckets = 5;
    int[] buckets = new int[numBuckets];
    long start = System.currentTimeMillis();
    for (int i = 0; i < numIterations; i++) {
      int val = jenkins.hash(Integer.toString(i).getBytes());
      buckets[Math.abs(val) % numBuckets] += 1;
    }
    System.out.println(System.currentTimeMillis() - start);

    double expected = numIterations / (double) numBuckets;
    for (int i = 0; i < numBuckets; i++) {
      System.out.println(i + " " + buckets[i] + " "
          + (buckets[i] / expected));
    }

  }

}

   
    
    
    
    
    
  








Related examples in the same category

1.Computing hash codes
2.A hash-code generator and a collection of static hash-code generation methods.
3.MD5 hash generator
4.Hash 32 String
5.Hash 64 String
6.MD5 hashing: Encodes a string
7.MD5 String
8.Hash Code BuilderHash Code Builder
9.HashCode generationHashCode generation
10.Get hash code for primitive data types
11.Return as hash code for the given object
12.Null Safe Hash Code
13.A very efficient java hash algorithm, based on the BuzHash algoritm
14.Easy implementation of hashCode
15.An implementation of the HMACT64 keyed hashing algorithm
16.Gets the hash code of an object returning zero when the object is null
17.Unify Hash
18.Secure Hash
19.FNV Hash
20.Jenkins Hash
21.Concurrent Cuckoo hashing using lock striping. Uses R/W locks for resizing. Exercise solution.
22.Concurrent Cuckoo hashing using lock striping.
23.encode Hex
24.Produces 32-bit hash for hash table lookup. (Jenkins Hash Function)
25.Key Value Hash
26.Paul Hsieh's Hash Function.
27.An extension of WeakReference that implements a sane equals and hashcode method.
28.Dual Key Hash Map
29.A hash map with int key and int values.
30.null Safe Equals and Hash
31.Generates a hash code for a given source code.
32.AtkinsonHash utility class implements the hash algorithm used by HyperCard's ask password command.
33.Hash Code AssistHash Code Assist
34.This is a very fast, non-cryptographic hash suitable for general hash-based lookup.
35.An advanced hash table supporting configurable garbage collection semantics of keys and values
36.Hash string