激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - javascript中實現兼容JAVA的hashCode算法代碼分享

javascript中實現兼容JAVA的hashCode算法代碼分享

2021-02-20 21:04JavaScript教程網 JavaScript

這篇文章主要介紹了javascript中實現兼容JAVA的hashCode算法代碼分享,實現跟JAVA中的運算結果一致,需要的朋友可以參考下

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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代碼:

?
1
2
3
4
5
6
7
8
9
10
11
<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中就沒這限制了。問題應該就是在這里了,于是對之前的方法做了一點改造:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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更新,上面那個效率比較低下,當內容很長的時候會當掉,下面的代碼是優化后的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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>

看過外人寫的

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

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

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

幸運的是,我發現Java支持位運算符,這些運算符被限制在32位整數數學中。

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

?
1
2
3
4
5
6
7
8
9
10
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中用的函數

?
1
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中實現兼容JAVA的hashCode算法代碼分享的詳細內容,更多關于javascript兼容JAVA的hashCode算法的資料請關注服務器之家其它相關文章!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产一级aaa全黄毛片 | 亚洲一区 国产精品 | 免费一级肉体全黄毛片 | 夜夜夜精品视频 | 欧美成人精品欧美一级乱黄 | 国产女王女m视频vk 毛片免费在线视频 | 国产美女的小嫩bbb图片 | 国产porn在线 | 成人免费毛片一 | 狠狠干最新网址 | 他也色在线视频 | 黑人一区二区 | av在线播放免费观看 | 97久久曰曰久久久 | 日本在线不卡一区二区三区 | 欧洲精品久久 | 欧美专区视频 | 3级毛片| 手机视频在线播放 | www.国产免费 | 一级毛片免费高清 | 国产69精品久久久久久久久久 | 人人舔人人舔 | 爱操视频| 成人在线观看一区二区三区 | 亚洲男人一区 | 三级xxxx| 无码专区aaaaaa免费视频 | 成人黄色短视频在线观看 | 国产一区二区三区视频在线观看 | 精品久久久久久久久久久aⅴ | 精品一区二区在线观看视频 | 成人午夜亚洲 | 特一级毛片 | 黄色片免费看看 | 精品国产一级毛片 | 手机在线看片国产 | 叉逼视频| 羞羞的小视频 | 国产欧美一区二区三区免费看 | 久草干|