You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					88 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					88 lines
				
				1.6 KiB
			| 
											3 years ago
										 | /* eslint no-fallthrough: 0 */ | ||
|  | /** | ||
|  |  * Mnemonist MurmurHash 3 | ||
|  |  * ======================= | ||
|  |  * | ||
|  |  * Straightforward implementation of the third version of MurmurHash. | ||
|  |  * | ||
|  |  * Note: this piece of code belong to haschisch. | ||
|  |  */ | ||
|  | 
 | ||
|  | /** | ||
|  |  * Various helpers. | ||
|  |  */ | ||
|  | function mul32(a, b) { | ||
|  |   return (a & 0xffff) * b + (((a >>> 16) * b & 0xffff) << 16) & 0xffffffff; | ||
|  | } | ||
|  | 
 | ||
|  | function sum32(a, b) { | ||
|  |   return (a & 0xffff) + (b >>> 16) + (((a >>> 16) + b & 0xffff) << 16) & 0xffffffff; | ||
|  | } | ||
|  | 
 | ||
|  | function rotl32(a, b) { | ||
|  |   return (a << b) | (a >>> (32 - b)); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * MumurHash3 function. | ||
|  |  * | ||
|  |  * @param  {number}    seed - Seed. | ||
|  |  * @param  {ByteArray} data - Data. | ||
|  |  */ | ||
|  | module.exports = function murmurhash3(seed, data) { | ||
|  |   var c1 = 0xcc9e2d51, | ||
|  |       c2 = 0x1b873593, | ||
|  |       r1 = 15, | ||
|  |       r2 = 13, | ||
|  |       m = 5, | ||
|  |       n = 0x6b64e654; | ||
|  | 
 | ||
|  |   var hash = seed, | ||
|  |       k1, | ||
|  |       i, | ||
|  |       l; | ||
|  | 
 | ||
|  |   for (i = 0, l = data.length - 4; i <= l; i += 4) { | ||
|  |     k1 = ( | ||
|  |       data[i] | | ||
|  |       (data[i + 1] << 8) | | ||
|  |       (data[i + 2] << 16) | | ||
|  |       (data[i + 3] << 24) | ||
|  |     ); | ||
|  | 
 | ||
|  |     k1 = mul32(k1, c1); | ||
|  |     k1 = rotl32(k1, r1); | ||
|  |     k1 = mul32(k1, c2); | ||
|  | 
 | ||
|  |     hash ^= k1; | ||
|  |     hash = rotl32(hash, r2); | ||
|  |     hash = mul32(hash, m); | ||
|  |     hash = sum32(hash, n); | ||
|  |   } | ||
|  | 
 | ||
|  |   k1 = 0; | ||
|  | 
 | ||
|  |   switch (data.length & 3) { | ||
|  |     case 3: | ||
|  |       k1 ^= data[i + 2] << 16; | ||
|  |     case 2: | ||
|  |       k1 ^= data[i + 1] << 8; | ||
|  |     case 1: | ||
|  |       k1 ^= data[i]; | ||
|  |       k1 = mul32(k1, c1); | ||
|  |       k1 = rotl32(k1, r1); | ||
|  |       k1 = mul32(k1, c2); | ||
|  |       hash ^= k1; | ||
|  |     default: | ||
|  |   } | ||
|  | 
 | ||
|  |   hash ^= data.length; | ||
|  |   hash ^= hash >>> 16; | ||
|  |   hash = mul32(hash, 0x85ebca6b); | ||
|  |   hash ^= hash >>> 13; | ||
|  |   hash = mul32(hash, 0xc2b2ae35); | ||
|  |   hash ^= hash >>> 16; | ||
|  | 
 | ||
|  |   return hash >>> 0; | ||
|  | }; |