package security; /** * @author Abdelkader Laouid * @author Massinissa Saoudi */ public class SuperFastHash { static byte [] data; static String strData; static long start; static int offset; static int len; public SuperFastHash(String nonceij, long nonceji, int idmax, int idMin) { strData = nonceij; start = nonceji; offset = idmax % 10; len = idMin % 10; } public long calculate(){ data = strData.getBytes(); long hash = start & 0xFFFFFFFF; long tmp; int rem; if (len < 1) return hash; rem = len & 3; len >>>= 2; int pos = offset; for (; len > 0; len--) { hash += (data[pos++] | (data[pos++] << 8)); tmp = ((data[pos++] | (data[pos++] << 8)) << 11) ^ hash; hash = ((hash << 16) ^ tmp); hash += (hash >>> 11); } switch (rem) { case 3: hash += (data[pos++] | (data[pos++] << 8)); hash ^= (hash << 16); hash ^= (data[pos++] << 18); hash += (hash >>> 11); break; case 2: hash += (data[pos++] | (data[pos++] << 8)); hash ^= (hash << 11); hash += (hash >>> 17); break; case 1: hash += data[pos++]; hash ^= (hash << 10); hash += (hash >>> 1); break; } hash ^= (hash << 3); hash += (hash >>> 5); hash ^= (hash << 4); hash += (hash >>> 17); hash ^= (hash << 25); hash += (hash >>> 6); String hashS = String.valueOf(hash); String newHashS = hashS.substring(0,16); long newHash = Long.parseLong(newHashS); if(newHash < 0) newHash = -newHash; return newHash & 0xFFFFFFFF; } }