欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript中實現(xiàn)兼容JAVA的hashCode算法代碼分享

 更新時間:2020年08月11日 20:28:30   投稿:junjie  
這篇文章主要介紹了javascript中實現(xiàn)兼容JAVA的hashCode算法代碼分享,實現(xiàn)跟JAVA中的運算結(jié)果一致,需要的朋友可以參考下

在java中一個hashCode算法,可以用來計算一個字符串的hash值,今天一個朋友突然問俺能不能在js中計算hashCode,要求和java的hashCode計算結(jié)果一樣。

對于java的hashCode,以前到現(xiàn)在也一直沒有了解過其算法,不過猜想應(yīng)該也不會太難,于是現(xiàn)在java中寫了這段代碼進行測試:
運行結(jié)果:899755

按下Ctrl鍵點擊hashCode方法名跟進去看了下其算法,發(fā)現(xiàn)是很簡單的幾句代碼,如下所示:

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

這下好,簡單移植過去到j(luò)s里就應(yīng)該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>

運行結(jié)果:899755

OK,與java計算結(jié)果一樣。本以為這么就搞定了,然后想著再隨便找個串測試下:

“沈陽沈陽啊”,在JAVA中運行結(jié)果為:1062711668,然而到j(luò)s中成了:26832515444。

狂暈,這隨便一試就有問題了!后思考片刻,突然想到Java中int長度好像是21億左右,js中就沒這限制了。問題應(yīng)該就是在這里了,于是對之前的方法做了一點改造:

<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!大功告成。沒有什么技術(shù)含量,一點小總結(jié)
2013-02-19更新,上面那個效率比較低下,當內(nèi)容很長的時候會當?shù)簦旅娴拇a是優(yōu)化后的代碼:

<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個線程在并發(fā)執(zhí)行,其余在隊列中如何實現(xiàn)')); //1107373715
</script>

看過外人寫的

Javascript implementation of Java's String.hashCode() method 21

這里是Java的直接替代品字符串.hashCode()用Javascript實現(xiàn)的方法。

我編寫這個函數(shù)是為了滿足工作中的一個需求。顯然,后端工程師認為hashCode()是一個標準函數(shù)。這個項目的一個障礙不僅是如何翻譯Java中用來生成hashCode()的數(shù)學公式,還包括如何強制Javascript使用32位整數(shù)數(shù)學(這不是一個小的壯舉)。

幸運的是,我發(fā)現(xiàn)Java支持位運算符,這些運算符被限制在32位整數(shù)數(shù)學中。

下面是Javascript生成的字符串原型。使用這個原型,您可以簡單地對任何字符串調(diào)用.hashCode(),例如“some string”.hashCode(),并接收一個數(shù)字哈希代碼(更具體地說,是一個Java等效代碼),如1395333309。

String.prototype.hashCode = function(){
	var hash = 0;
	if (this.length == 0) return hash;
	for (i = 0; i < this.length; i++) {
		char = this.charCodeAt(i);
		hash = ((hash<<5)-hash)+char;
		hash = hash & hash; // Convert to 32bit integer
	}
	return hash;
}

另外分享一個phpcom中用的函數(shù)

String.prototype.hashCode = function() {for (var a = 31,b = 0,c = this.length; b < c;) a ^= (a << 5) + (a >> 2) + this.charCodeAt(b++); return a};

以上就是javascript中實現(xiàn)兼容JAVA的hashCode算法代碼分享的詳細內(nèi)容,更多關(guān)于javascript兼容JAVA的hashCode算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何學習Javascript入門指導

    如何學習Javascript入門指導

    首先要說明的是,咱現(xiàn)在不是高手,最多還是一個半桶水,算是入了JS的門
    2013-11-11
  • appendChild() 或 insertBefore()使用與區(qū)別介紹

    appendChild() 或 insertBefore()使用與區(qū)別介紹

    appendChild() 方法在節(jié)點的子節(jié)點列表末添加新的子節(jié)點。insertBefore() 方法在節(jié)點的子節(jié)點列表任意位置插入新的節(jié)點,下面為大家介紹下具體的使用,感興趣的朋友不要錯過
    2013-10-10
  • js 頁面輸出值

    js 頁面輸出值

    下面的方法是常用的向html頁面中輸入值,一般是將要輸出的內(nèi)容放到別的js文件中,調(diào)用。這里只是測試。
    2008-11-11
  • 有趣的javascript數(shù)組定義方法

    有趣的javascript數(shù)組定義方法

    下面都是講javascript的以人對象說明索引是數(shù)值的數(shù)組:
    2010-09-09
  • 不懂JavaScript應(yīng)該怎樣學

    不懂JavaScript應(yīng)該怎樣學

    文是JavaScript庫Mootools的入門性介紹文章,詳細介紹了在網(wǎng)上能找到的比較好的學習HTML,CSS,JavaScript入門知識的資源以及隨手參考的地方。文中介紹的從零入手學習JavaScript編程的過程很有參考價值。
    2008-04-04
  • Javascript入門學習第七篇 js dom實例操作

    Javascript入門學習第七篇 js dom實例操作

    上篇文章我們講了 用dom方式 創(chuàng)建節(jié)點,復制節(jié)點,插入節(jié)點。 今天我們將講 刪除節(jié)點,替換節(jié)點,查找節(jié)點等。
    2008-07-07
  • javascript中的107個基礎(chǔ)知識收集整理 推薦

    javascript中的107個基礎(chǔ)知識收集整理 推薦

    這篇文章對于初學者絕對是個不錯的整理,需要的朋友可以收藏下。
    2010-03-03
  • JavaScript稀疏數(shù)組示例教程

    JavaScript稀疏數(shù)組示例教程

    這篇文章主要為大家介紹了JavaScript稀疏數(shù)組的使用示例教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • javascript 命名規(guī)則 變量命名規(guī)則

    javascript 命名規(guī)則 變量命名規(guī)則

    匈牙利命名法是一位微軟程序員發(fā)明的,多數(shù)的C,C++程序都使用此命名法。
    2010-02-02
  • javascript真的不難-回顧一下基礎(chǔ)知識

    javascript真的不難-回顧一下基礎(chǔ)知識

    先來學習一下Javascript語言中的基礎(chǔ)知識問題其時對于每種編程語言來說基礎(chǔ)知識都是大同小異的,對變量,函數(shù),條件語句塊,循環(huán)語句塊等等,本文簡要介紹一下,感興趣的朋友可以了解下
    2013-01-01

最新評論