int (CharSequence data, int seed) { final int length = data.length(); // 'm' and 'r' are mixing constants generated offline. // They're not really 'magic', they just happen to work well. final int m = 0x5bd1e995; final int r = 24; // Initialize the hash to a random value int h = seed ^ length; int length4 = length >> 2; for (int i = 0; i < length4; i++) { final int i4 = i << 2; int k = data.charAt(i4) + (data.charAt(i4 + 1) << 8) + (data.charAt(i4 + 2) << 16) + (data.charAt(i4 + 3) << 24); k *= m; k ^= k >>> r; k *= m; h *= m; h ^= k; } // Handle the last few bytes of the input array switch (length % 4) { case 3: h ^= data.charAt((length & ~3) + 2) << 16; case 2: h ^= data.charAt((length & ~3) + 1) << 8; case 1: h ^= data.charAt(length & ~3); h *= m; } h ^= h >>> 13; h *= m; h ^= h >>> 15; return h; }