mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
	
	
		
			46 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			46 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
|  | /* | ||
|  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||
|  | 	Author Tobias Koppers @sokra | ||
|  | */ | ||
|  | 
 | ||
|  | "use strict"; | ||
|  | 
 | ||
|  | const SAFE_LIMIT = 0x80000000; | ||
|  | const SAFE_PART = SAFE_LIMIT - 1; | ||
|  | const COUNT = 4; | ||
|  | const arr = [0, 0, 0, 0, 0]; | ||
|  | const primes = [3, 7, 17, 19]; | ||
|  | 
 | ||
|  | module.exports = (str, range) => { | ||
|  | 	arr.fill(0); | ||
|  | 	for (let i = 0; i < str.length; i++) { | ||
|  | 		const c = str.charCodeAt(i); | ||
|  | 		for (let j = 0; j < COUNT; j++) { | ||
|  | 			const p = (j + COUNT - 1) % COUNT; | ||
|  | 			arr[j] = (arr[j] + c * primes[j] + arr[p]) & SAFE_PART; | ||
|  | 		} | ||
|  | 		for (let j = 0; j < COUNT; j++) { | ||
|  | 			const q = arr[j] % COUNT; | ||
|  | 			arr[j] = arr[j] ^ (arr[q] >> 1); | ||
|  | 		} | ||
|  | 	} | ||
|  | 	if (range <= SAFE_PART) { | ||
|  | 		let sum = 0; | ||
|  | 		for (let j = 0; j < COUNT; j++) { | ||
|  | 			sum = (sum + arr[j]) % range; | ||
|  | 		} | ||
|  | 		return sum; | ||
|  | 	} else { | ||
|  | 		let sum1 = 0; | ||
|  | 		let sum2 = 0; | ||
|  | 		const rangeExt = Math.floor(range / SAFE_LIMIT); | ||
|  | 		for (let j = 0; j < COUNT; j += 2) { | ||
|  | 			sum1 = (sum1 + arr[j]) & SAFE_PART; | ||
|  | 		} | ||
|  | 		for (let j = 1; j < COUNT; j += 2) { | ||
|  | 			sum2 = (sum2 + arr[j]) % rangeExt; | ||
|  | 		} | ||
|  | 		return (sum2 * SAFE_LIMIT + sum1) % range; | ||
|  | 	} | ||
|  | }; |