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
						
					
					
				/* 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;
 | 
						|
};
 |