Paul Hsieh's Hash Function.
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ //package org.ancora.SharedLibrary; /** * Methods for bit manipulation. * * @author Joao Bispo */ public class Util{ private static final long MASK_16_BITS = 0xFFFFL; private static final int MASK_BIT_1 = 0x1; /** * Paul Hsieh's Hash Function. * * @param data data to hash * @param dataLength length of the data, in bytes * @param hashedValue previous value of the hash. If it is the start of the * method, used the length of the data (ex.: 8 bytes). * @return */ public static int superFastHash(long data, int hash) { int tmp; //int rem; //if (len <= 0) { // return 0; //} //rem = len & 3; //len >>= 2; //Main Loop for (int i = 0; i < 4; i += 2) { // Get lower 16 bits hash += get16BitsAligned(data, i); // Calculate some random value with second-lower 16 bits tmp = (get16BitsAligned(data, i + 1) << 11) ^ hash; hash = (hash << 16) ^ tmp; // At this point, it would advance the data, but since it is restricted // to longs (64-bit values), it is unnecessary). hash += hash >> 11; } // Handle end cases // // There are no end cases, main loop is done in chuncks of 32 bits. // Force "avalanching" of final 127 bits // hash ^= hash << 3; hash += hash >> 5; hash ^= hash << 4; hash += hash >> 17; hash ^= hash << 25; hash += hash >> 6; return hash; } /** * Returns 16 bits from the long number. * * @param data * @param offset one of 0 to 3 * @return */ public static int get16BitsAligned(long data, int offset) { // Normalize offset offset = offset%4; //System.out.println("offset:"+offset); // Align the mask long mask = MASK_16_BITS << 16*offset; //System.out.println("Mask:"+Long.toHexString(mask)); //System.out.println("Data:"+Long.toHexString(data)); // Get the bits long result = data & mask; // Put bits in position return (int) (result >>> (16*offset)); } }