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.
		
		
		
		
		
			
		
			
				
					108 lines
				
				1.7 KiB
			
		
		
			
		
	
	
					108 lines
				
				1.7 KiB
			| 
											3 years ago
										 | /* eslint no-constant-condition: 0 */ | ||
|  | /** | ||
|  |  * Mnemonist Hashtable Helpers | ||
|  |  * ============================ | ||
|  |  * | ||
|  |  * Miscellaneous helpers helper function dealing with hashtables. | ||
|  |  */ | ||
|  | function jenkinsInt32(a) { | ||
|  | 
 | ||
|  |   a = (a + 0x7ed55d16) + (a << 12); | ||
|  |   a = (a ^ 0xc761c23c) ^ (a >> 19); | ||
|  |   a = (a + 0x165667b1) + (a << 5); | ||
|  |   a = (a + 0xd3a2646c) ^ (a << 9); | ||
|  |   a = (a + 0xfd7046c5) + (a << 3); | ||
|  |   a = (a ^ 0xb55a4f09) ^ (a >> 16); | ||
|  | 
 | ||
|  |   return a; | ||
|  | } | ||
|  | 
 | ||
|  | function linearProbingGet(hash, keys, values, key) { | ||
|  |   var n = keys.length, | ||
|  |       j = hash(key) & (n - 1), | ||
|  |       i = j; | ||
|  | 
 | ||
|  |   var c; | ||
|  | 
 | ||
|  |   while (true) { | ||
|  |     c = keys[i]; | ||
|  | 
 | ||
|  |     if (c === key) | ||
|  |       return values[i]; | ||
|  | 
 | ||
|  |     else if (c === 0) | ||
|  |       return; | ||
|  | 
 | ||
|  |     // Handling wrapping around
 | ||
|  |     i += 1; | ||
|  |     i %= n; | ||
|  | 
 | ||
|  |     // Full turn
 | ||
|  |     if (i === j) | ||
|  |       return; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function linearProbingHas(hash, keys, key) { | ||
|  |   var n = keys.length, | ||
|  |       j = hash(key) & (n - 1), | ||
|  |       i = j; | ||
|  | 
 | ||
|  |   var c; | ||
|  | 
 | ||
|  |   while (true) { | ||
|  |     c = keys[i]; | ||
|  | 
 | ||
|  |     if (c === key) | ||
|  |       return true; | ||
|  | 
 | ||
|  |     else if (c === 0) | ||
|  |       return false; | ||
|  | 
 | ||
|  |     // Handling wrapping around
 | ||
|  |     i += 1; | ||
|  |     i %= n; | ||
|  | 
 | ||
|  |     // Full turn
 | ||
|  |     if (i === j) | ||
|  |       return false; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function linearProbingSet(hash, keys, values, key, value) { | ||
|  |   var n = keys.length, | ||
|  |       j = hash(key) & (n - 1), | ||
|  |       i = j; | ||
|  | 
 | ||
|  |   var c; | ||
|  | 
 | ||
|  |   while (true) { | ||
|  |     c = keys[i]; | ||
|  | 
 | ||
|  |     if (c === 0 || c === key) | ||
|  |       break; | ||
|  | 
 | ||
|  |     // Handling wrapping around
 | ||
|  |     i += 1; | ||
|  |     i %= n; | ||
|  | 
 | ||
|  |     // Full turn
 | ||
|  |     if (i === j) | ||
|  |       throw new Error('mnemonist/utils/hash-tables.linearProbingSet: table is full.'); | ||
|  |   } | ||
|  | 
 | ||
|  |   keys[i] = key; | ||
|  |   values[i] = value; | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = { | ||
|  |   hashes: { | ||
|  |     jenkinsInt32: jenkinsInt32 | ||
|  |   }, | ||
|  |   linearProbing: { | ||
|  |     get: linearProbingGet, | ||
|  |     has: linearProbingHas, | ||
|  |     set: linearProbingSet | ||
|  |   } | ||
|  | }; |