Created
March 17, 2012 08:24
-
-
Save tamtam180/2056627 to your computer and use it in GitHub Desktop.
MurmurHash2のJava実装。32ビットハッシュを求めるやつと64ビットハッシュを求めるやつ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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