Skip to content

Instantly share code, notes, and snippets.

@tamtam180
Created March 17, 2012 06:54
Show Gist options
  • Save tamtam180/2055893 to your computer and use it in GitHub Desktop.
Save tamtam180/2055893 to your computer and use it in GitHub Desktop.
MurmurHash1のJava実装. オリジナル実装はunsigned intで行っているが、signed intでもビットパターンは変わらないので問題なし(のはず)
public class MurmurHash1 {
public long digest(byte[] data, int seed, boolean bigendian) {
int m = 0xc6a4a793;
int r = 16;
int len = data.length;
int h = seed ^ (len * m);
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));
h += k;
h *= m;
h ^= h >>> 16;
}
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 >>> r;
}
h *= m;
h ^= h >>> 10;
h *= m;
h ^= h >>> 17;
return (long) h & 0xffffffffL;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment