Skip to content

Instantly share code, notes, and snippets.

@tamtam180
Created March 17, 2012 08:24
Show Gist options
  • Save tamtam180/2056627 to your computer and use it in GitHub Desktop.
Save tamtam180/2056627 to your computer and use it in GitHub Desktop.
MurmurHash2のJava実装。32ビットハッシュを求めるやつと64ビットハッシュを求めるやつ
public class EncodeUtils {
public static long toLongBE(byte[] b, int offset) {
return (((long)b[offset+0] << 56) +
((long)(b[offset+1] & 255) << 48) +
((long)(b[offset+2] & 255) << 40) +
((long)(b[offset+3] & 255) << 32) +
((long)(b[offset+4] & 255) << 24) +
((b[offset+5] & 255) << 16) +
((b[offset+6] & 255) << 8) +
((b[offset+7] & 255) << 0));
}
public static long toLongLE(byte[] b, int offset) {
return (((long)b[offset+7] << 56) +
((long)(b[offset+6] & 255) << 48) +
((long)(b[offset+5] & 255) << 40) +
((long)(b[offset+4] & 255) << 32) +
((long)(b[offset+3] & 255) << 24) +
((b[offset+2] & 255) << 16) +
((b[offset+1] & 255) << 8) +
((b[offset+0] & 255) << 0));
}
}
public class MurmurHash2 {
public static int digest32(byte[] data, int seed, boolean bigendian) {
final int m = 0x5bd1e995;
final int r = 24;
final int len = data.length;
int h = seed ^ len;
int block_remain = len % 4;
int block_size = len - block_remain;
int i = 0;
for (i = 0; i < block_size; i += 4) {
int k = bigendian
? ((data[i+0] << 24) + (data[i+1] << 16) + (data[i+2] << 8) + (data[i+3] << 0))
: ((data[i+3] << 24) + (data[i+2] << 16) + (data[i+1] << 8) + (data[i+0] << 0));
k *= m;
k ^= k >>> r;
k *= m;
h *= m;
h ^= k;
}
switch (block_remain) {
case 3:
h ^= data[i + 2] << 16;
case 2:
h ^= data[i + 1] << 8;
case 1:
h ^= data[i];
h *= m;
}
h ^= h >>> 13;
h *= m;
h ^= h >>> 15;
return h;
}
public static long digest64(byte[] data, long seed, boolean bigendian) {
final long m = 0xc6a4a7935bd1e995L;
final int r = 47;
final int len = data.length;
long h = seed ^ (m * len);
int block_remain = len % 8;
int block_size = len - block_remain;
int i = 0;
for (i = 0; i < block_size; i += 8) {
long k = bigendian
? EncodeUtils.toLongBE(data, i)
: EncodeUtils.toLongLE(data, i);
k *= m;
k ^= k >>> r;
k *= m;
h ^= k;
h *= m;
}
switch (block_remain) {
case 7: h ^= (long)data[i + 6] << 48;
case 6: h ^= (long)data[i + 5] << 40;
case 5: h ^= (long)data[i + 4] << 32;
case 4: h ^= (long)data[i + 3] << 24;
case 3: h ^= data[i + 2] << 16;
case 2: h ^= data[i + 1] << 8;
case 1: h ^= data[i + 0];
h *= m;
}
h ^= h >>> r;
h *= m;
h ^= h >>> r;
return h;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment