node-murmurhash
Advanced tools
Comparing version
2.1.0 / 2015-11-26 | ||
================== | ||
* feat: use Math.imul (@alsotang) | ||
2.0.1 / 2015-07-21 | ||
@@ -3,0 +8,0 @@ ================== |
@@ -22,39 +22,19 @@ /**! | ||
// @zhangzifa: c语言中,大于127的char, 在转成 int 时, 表示成0xffffffxx的形式 | ||
var NEGTIVE_MAP = [ | ||
0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, | ||
0xc, 0xd, 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | ||
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, | ||
0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, | ||
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, | ||
0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, | ||
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, | ||
0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, | ||
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, | ||
0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, | ||
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, | ||
0xffffff80, 0xffffff81, 0xffffff82, 0xffffff83, 0xffffff84, 0xffffff85, | ||
0xffffff86, 0xffffff87, 0xffffff88, 0xffffff89, 0xffffff8a, 0xffffff8b, | ||
0xffffff8c, 0xffffff8d, 0xffffff8e, 0xffffff8f, 0xffffff90, 0xffffff91, | ||
0xffffff92, 0xffffff93, 0xffffff94, 0xffffff95, 0xffffff96, 0xffffff97, | ||
0xffffff98, 0xffffff99, 0xffffff9a, 0xffffff9b, 0xffffff9c, 0xffffff9d, | ||
0xffffff9e, 0xffffff9f, 0xffffffa0, 0xffffffa1, 0xffffffa2, 0xffffffa3, | ||
0xffffffa4, 0xffffffa5, 0xffffffa6, 0xffffffa7, 0xffffffa8, 0xffffffa9, | ||
0xffffffaa, 0xffffffab, 0xffffffac, 0xffffffad, 0xffffffae, 0xffffffaf, | ||
0xffffffb0, 0xffffffb1, 0xffffffb2, 0xffffffb3, 0xffffffb4, 0xffffffb5, | ||
0xffffffb6, 0xffffffb7, 0xffffffb8, 0xffffffb9, 0xffffffba, 0xffffffbb, | ||
0xffffffbc, 0xffffffbd, 0xffffffbe, 0xffffffbf, 0xffffffc0, 0xffffffc1, | ||
0xffffffc2, 0xffffffc3, 0xffffffc4, 0xffffffc5, 0xffffffc6, 0xffffffc7, | ||
0xffffffc8, 0xffffffc9, 0xffffffca, 0xffffffcb, 0xffffffcc, 0xffffffcd, | ||
0xffffffce, 0xffffffcf, 0xffffffd0, 0xffffffd1, 0xffffffd2, 0xffffffd3, | ||
0xffffffd4, 0xffffffd5, 0xffffffd6, 0xffffffd7, 0xffffffd8, 0xffffffd9, | ||
0xffffffda, 0xffffffdb, 0xffffffdc, 0xffffffdd, 0xffffffde, 0xffffffdf, | ||
0xffffffe0, 0xffffffe1, 0xffffffe2, 0xffffffe3, 0xffffffe4, 0xffffffe5, | ||
0xffffffe6, 0xffffffe7, 0xffffffe8, 0xffffffe9, 0xffffffea, 0xffffffeb, | ||
0xffffffec, 0xffffffed, 0xffffffee, 0xffffffef, 0xfffffff0, 0xfffffff1, | ||
0xfffffff2, 0xfffffff3, 0xfffffff4, 0xfffffff5, 0xfffffff6, 0xfffffff7, | ||
0xfffffff8, 0xfffffff9, 0xfffffffa, 0xfffffffb, 0xfffffffc, 0xfffffffd, | ||
0xfffffffe, 0xffffffff | ||
]; | ||
function negative(num) { | ||
if (num < 127) { | ||
return num; | ||
} | ||
return num | 0xffffff00 | ||
} | ||
var imul = (function () { | ||
if (Math.imul) { | ||
return Math.imul; | ||
} else { | ||
return function (a, b) { | ||
return ((((a >> 16) * b) & 0xffff) << 16) + ((a & 0xffff) * b) | ||
} | ||
} | ||
})() | ||
function murmurhash2js(key, seed) { | ||
@@ -74,8 +54,8 @@ var l = key.length; | ||
// 此处两个 32 位整数相乘时,有可能产生 64 位的结果,导致精度丢失。 | ||
k = (((k & 0xffff) * MURMURHASH_M) + ((((k >>> 16) * MURMURHASH_M) & 0xffff) << 16)); | ||
k = imul(k, MURMURHASH_M) | ||
k ^= k >>> 24; | ||
k = (((k & 0xffff) * MURMURHASH_M) + ((((k >>> 16) * MURMURHASH_M) & 0xffff) << 16)); | ||
k = imul(k, MURMURHASH_M) | ||
h = (((h & 0xffff) * MURMURHASH_M) + ((((h >>> 16) * MURMURHASH_M) & 0xffff) << 16)) ^ k; | ||
h = imul(h, MURMURHASH_M) ^ k | ||
@@ -88,12 +68,12 @@ l -= 4; | ||
case 3: | ||
h ^= NEGTIVE_MAP[key[i + 2]] << 16; | ||
h ^= negative(key[i + 2]) << 16; | ||
case 2: | ||
h ^= NEGTIVE_MAP[key[i + 1]] << 8; | ||
h ^= negative(key[i + 1]) << 8; | ||
case 1: | ||
h ^= NEGTIVE_MAP[key[i]]; | ||
h = (((h & 0xffff) * MURMURHASH_M) + ((((h >>> 16) * MURMURHASH_M) & 0xffff) << 16)); | ||
h ^= negative(key[i]); | ||
h = imul(h, MURMURHASH_M) | ||
} | ||
h ^= h >>> 13; | ||
h = (((h & 0xffff) * MURMURHASH_M) + ((((h >>> 16) * MURMURHASH_M) & 0xffff) << 16)); | ||
h = imul(h, MURMURHASH_M) | ||
h ^= h >>> 15; | ||
@@ -100,0 +80,0 @@ |
@@ -17,2 +17,3 @@ /**! | ||
/** | ||
@@ -19,0 +20,0 @@ * Murmur hash v2 |
{ | ||
"name": "node-murmurhash", | ||
"version": "2.0.1", | ||
"version": "2.1.0", | ||
"description": "murmurhash V2, support utf8 Buffer", | ||
@@ -5,0 +5,0 @@ "main": "lib/murmurhash.js", |
@@ -46,12 +46,11 @@ node-murmurhash | ||
``` | ||
cpu: 1.4 GHz Intel Core i5 | ||
node version: v2.3.0, date: Tue Jul 21 2015 17:35:09 GMT+0800 (CST) | ||
node version: v4.2.1, date: Sun Nov 15 2015 01:01:49 GMT+0800 (CST) | ||
Starting... | ||
2 tests completed. | ||
murmurhash(new Buffer('haha, this is key')) x 6,626,182 ops/sec ±1.89% (80 runs sampled) | ||
murmurhash(new Buffer('hello 中国')) x 8,510,543 ops/sec ±2.24% (80 runs sampled) | ||
murmurhash(new Buffer(ascii)) x 21,164,676 ops/sec ±0.85% (98 runs sampled) | ||
murmurhash(new Buffer(utf8)) x 13,926,544 ops/sec ±0.59% (99 runs sampled) | ||
``` | ||
see also: [benchmark.md](benchmark.md) | ||
see also: [benchmark](test/benchmark.js) | ||
@@ -58,0 +57,0 @@ ## License |
7766
-24.27%96
-17.95%59
-1.67%