最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

按下Ctrl鍵點(diǎn)擊hashCode方法名跟進(jìn)去看了下其算法,發(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>

運(yùn)行結(jié)果:899755

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

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

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

<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ù)含量,一點(diǎn)小總結(jié)
2013-02-19更新,上面那個(gè)效率比較低下,當(dāng)內(nèi)容很長的時(shí)候會當(dāng)?shù)?,下面的代碼是優(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#同一時(shí)間N個(gè)線程在并發(fā)執(zhí)行,其余在隊(duì)列中如何實(shí)現(xiàn)')); //1107373715
</script>

看過外人寫的

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

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

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

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

下面是Javascript生成的字符串原型。使用這個(gè)原型,您可以簡單地對任何字符串調(diào)用.hashCode(),例如“some string”.hashCode(),并接收一個(gè)數(shù)字哈希代碼(更具體地說,是一個(gè)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;
}

另外分享一個(gè)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中實(shí)現(xiàn)兼容JAVA的hashCode算法代碼分享的詳細(xì)內(nèi)容,更多關(guān)于javascript兼容JAVA的hashCode算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • js數(shù)組常用最重要的方法

    js數(shù)組常用最重要的方法

    本篇文章給大家整理了JS數(shù)組中最重要的常用方法,本次整理的是小編認(rèn)為大家在使用中最常用也是最重要的方法,一起學(xué)習(xí)下。
    2018-02-02
  • js時(shí)間比較示例分享(日期比較)

    js時(shí)間比較示例分享(日期比較)

    這篇文章主要介紹了js時(shí)間比較示例,代碼簡單,運(yùn)行后可以看到結(jié)果,需要的朋友可以參考下
    2014-03-03
  • Knockoutjs快速入門(經(jīng)典)

    Knockoutjs快速入門(經(jīng)典)

    Knockoutjs是一個(gè)JavaScript實(shí)現(xiàn)的MVVM框架.主要有如下幾個(gè)功能1. Declarative bindings2. Observables and dependency tracking3. Templating,需要了解的朋友可以參考下
    2012-12-12
  • JavaScript中的parse()方法使用簡介

    JavaScript中的parse()方法使用簡介

    這篇文章主要介紹了JavaScript中的parse()方法使用簡介,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-06-06
  • 淺談js的setInterval事件

    淺談js的setInterval事件

    這篇文章主要介紹了js的setInterval方法的用法以及示例,非常的有用,這里推薦給小伙伴們
    2014-12-12
  • JavaScript中String.match()方法的使用詳解

    JavaScript中String.match()方法的使用詳解

    這篇文章主要介紹了JavaScript中String.match()方法的使用詳解,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-06-06
  • 簡單談?wù)凧avascript函數(shù)中的arguments

    簡單談?wù)凧avascript函數(shù)中的arguments

    在JavaScript中,arguments對象是比較特別的一個(gè)對象,實(shí)際上是當(dāng)前函數(shù)的一個(gè)內(nèi)置屬性。下面這篇文章主要介紹了關(guān)于Javascript函數(shù)中的arguments面貌以及如何轉(zhuǎn)化為數(shù)組的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • js導(dǎo)航菜單(自寫)簡單大方

    js導(dǎo)航菜單(自寫)簡單大方

    一個(gè)簡單的多級下拉菜單菜單但是由于業(yè)務(wù)和樣式上的要求,為了簡潔找了好多都不適合于是自己寫了一個(gè),曬出來與大家分享,感興趣的朋友可以參考下哈,希望可以幫助到你
    2013-03-03
  • JavaScript基礎(chǔ)之Array?forEach使用示例

    JavaScript基礎(chǔ)之Array?forEach使用示例

    這篇文章主要為大家介紹了JavaScript基礎(chǔ)之Array?forEach使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • javascript確認(rèn)框的三種使用方法

    javascript確認(rèn)框的三種使用方法

    javascript確認(rèn)框的三種使用方法,在開發(fā)中經(jīng)常要用到,記錄一下使用方法
    2013-12-12

最新評論

水城县| 河津市| 奉节县| 乌拉特前旗| 永康市| 沅江市| 工布江达县| 岗巴县| 永登县| 延吉市| 泗洪县| 乐平市| 元氏县| 广宗县| 太原市| 桐梓县| 丹江口市| 常德市| 宣城市| 青冈县| 仙游县| 南汇区| 泰顺县| 定兴县| 米泉市| 海阳市| 阳谷县| 河津市| 南江县| 宝丰县| 霍林郭勒市| 北辰区| 萨嘎县| 东至县| 定州市| 衡东县| 连云港市| 澄江县| 望奎县| 沈丘县| 冕宁县|