All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.versionone.utils.HashCode Maven / Gradle / Ivy

package com.versionone.utils;


/**
 * Generate good hashcode from integer data.
 * 
 * Adapted from Paul Hsieh's SuperFastHash.
 * http://www.azillionmonkeys.com/qed/hash.html
 */
public class HashCode {
	// Borrowed from FNV hash algorithm's 32-bit prime multiplier
	private static final int magic = 16777619;
	private int _hash = magic;

	public static int Hash(int data1) {
		int hash = magic;
		hash = MixHash(hash, data1);
		return (int) PostHash(hash);
	}

	public static int Hash(Object data1) {
		return Hash(data1.hashCode());
	}

	public static int Hash(int data1, int data2) {
		int hash = magic;
		hash = MixHash(hash, data1);
		hash = MixHash(hash, data2);
		return (int) PostHash(hash);
	}

	public static int Hash(Object data1, Object data2) {
		return Hash(data1.hashCode(), data2.hashCode());
	}

	public static int Hash(int data1, int data2, int data3) {
		int hash = magic;
		hash = MixHash(hash, data1);
		hash = MixHash(hash, data2);
		hash = MixHash(hash, data3);
		return (int) PostHash(hash);
	}

	public static int Hash(Object data1, Object data2, Object data3) {
		return Hash(data1.hashCode(), data2.hashCode(), data3.hashCode());
	}

	public static int Hash(int[] data) {
		int hash = magic;
		for (int datum : data)
			hash = MixHash(hash, datum);
		return (int) PostHash(hash);
	}

	public static int Hash(byte[] data) {
		int hash = magic;
		for (byte datum : data)
			hash = MixHash(hash, datum);
		return (int) PostHash(hash);
	}

	public static int Hash(Object[] data) {
		int hash = magic;
		for (Object datum : data)
			hash = MixHash(hash, datum.hashCode());
		return (int) PostHash(hash);
	}

	public static int Hash(String data) {
		int hash = magic;
		for (char datum : data.toCharArray())
			hash = MixHash(hash, datum);
		return (int) PostHash(hash);
	}

	private static int MixHash(int hash, int data) {
		int lo16 = data & 0xFFFF;
		int hi16 = data >> 16;
		hash += lo16;
		hash ^= hash << 16;
		hash ^= hi16 << 11;
		hash += hash >> 11;
		return hash;
	}

	private static int PostHash(int hash) {
		hash ^= hash << 3;
		hash += hash >> 5;
		hash ^= hash << 2;
		hash += hash >> 15;
		hash ^= hash << 10;
		return hash;
	}

	public void Mix(int data) {
		_hash = MixHash(_hash, data);
	}

	public void Mix(Object data) {
		Mix(data.hashCode());
	}

	public int getValue() {
		return (int) PostHash(_hash);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy