在java中一個hashCode算法,可以用來計算一個字符串的hash值,今天一個朋友突然問俺能不能在js中計算hashCode,要求和java的hashCode計算結果一樣。
			對于java的hashCode,以前到現在也一直沒有了解過其算法,不過猜想應該也不會太難,于是現在java中寫了這段代碼進行測試:
		運行結果:899755
			按下Ctrl鍵點擊hashCode方法名跟進去看了下其算法,發現是很簡單的幾句代碼,如下所示:
			復制代碼代碼如下:
					public int hashCode() {
		int h = hash;
		if (h == 0) {
		int off = offset;
		char val[] = value;
		int len = count;		
			 
					for (int i = 0; i < len; i++) {
			h = 31*h + val[off++];
			}
			hash = h;
			}
			return h;
			}
	 			 
			這下好,簡單移植過去到js里就應該ok了。于是寫出如下JS代碼:
			復制代碼代碼如下:
			
		<script type="text/javascript">
		function hashCode(str){
		         var h = 0, off = 0;
		         var len = str.length;
		         for(var i = 0; i < len; i++){
		             h = 31 * h + str.charCodeAt(off++);
		         }
		         return h;
		     }
		     alert(hashCode('沈陽'));
		   </script>
		運行結果:899755	
		 
			OK,與java計算結果一樣。本以為這么就搞定了,然后想著再隨便找個串測試下:
			“沈陽沈陽啊”,在JAVA中運行結果為:1062711668,然而到js中成了:26832515444。
			狂暈,這隨便一試就有問題了!后思考片刻,突然想到Java中int長度好像是21億左右,js中就沒這限制了。問題應該就是在這里了,于是對之前的方法做了一點改造:
			復制代碼代碼如下:
			
		<script>
		function hashCode(str){
		         var h = 0, off = 0;
		         var len = str.length;
		         for(var i = 0; i < len; i++){
		             h = 31 * h + str.charCodeAt(off++);
		         }
		     var t=-2147483648*2;
		     while(h>2147483647){
		       h+=t
		     }
		         return h;
		     }
		alert(hashCode('沈陽沈陽啊'));</script>
			 
			再次測試!OK!大功告成。沒有什么技術含量,一點小總結
		2013-02-19更新,上面那個效率比較低下,當內容很長的時候會當掉,下面的代碼是優化后的代碼:
			復制代碼代碼如下:
			
		<script>
		    function hashCode(str) {
		        var h = 0;
		        var len = str.length;
		        var t = 2147483648;
		        for (var i = 0; i < len; i++) {
		            h = 31 * h + str.charCodeAt(i);
		            if(h > 2147483647) h %= t;//java int溢出則取模
		        }
		        /*var t = -2147483648 * 2;
		        while (h > 2147483647) {
		            h += t
		        }*/
		        return h;
		    }
		    alert(hashCode('C#同一時間N個線程在并發執行,其余在隊列中如何實現')); //1107373715
		</script>