package ddth.dasp.framework.utils; import java.nio.charset.Charset; import com.google.common.hash.HashFunction; import com.google.common.hash.Hashing; public class HashUtils { private final static HashFunction hashFunction = Hashing.murmur3_128(0); private final static Charset UTF8 = Charset.forName("UTF-8"); /** * Calculate hash value of an object using a fast non-cryptographic-strength * hash function. * * @param object * @return */ public static long fastHashValue(Object object) { if (object == null) { return 0; } if (object instanceof Boolean || object instanceof Number || object instanceof String) { return hashFunction.hashString(object.toString(), UTF8).asLong(); } return hashFunction.hashInt(object.hashCode()).asLong(); } /** * Maps an object to a slot, using linear hash method. * * This method uses a fast non-cryptographic-strength hash function to * calculate object's hash value. * * @param object * @param numSlots * @return */ public static long linearHashingMap(Object object, long numSlots) { if (numSlots < 1) { String msg = "Number of slots must be equal or larger than 1!"; throw new IllegalArgumentException(msg); } if (numSlots == 1 || object == null) { return 0; } return Math.abs(fastHashValue(object) % numSlots); } /** * Maps an object to a slow, using consistent hash method. * * This method uses a fast non-cryptographic-strength hash function to * calculate object's hash value. * * @param object * @param numSlots */ public static long consistentHashingMap(Object object, long numSlots) { if (numSlots < 1) { String msg = "Number of slots must be equal or larger than 1!"; throw new IllegalArgumentException(msg); } if (numSlots == 1 || object == null) { return 0; } long hashValue = fastHashValue(object); return Hashing.consistentHash(hashValue, (int) numSlots); } public static void main(String[] args) { for (int i = 0; i < 100; i++) { long hash4 = consistentHashingMap(i, 4); long hash5 = consistentHashingMap(i, 5); long hash6 = consistentHashingMap(i, 6); System.out.println(hash4 + "/" + hash5 + "/" + hash6); } } }