javascript的hashCode函式實現程式碼小結
阿新 • • 發佈:2020-08-13
為了使用的方便,稍稍再改良了一下
function hashcode(str) { var hash = 0,i,chr,len; if (str.length === 0) return hash; for (i = 0,len = str.length; i < len; i++) { chr = str.charCodeAt(i); hash = ((hash << 5) - hash) + chr; hash |= 0; // Convert to 32bit integer } return hash; } hashcode("this is a string") //-1853110172
這裡接受的引數是一個 String,其它型別怎麼辦?可以先做一個統一的處理,比如
hashcode(JSON.stringify(obj))
序列化之後再使用 hashCode 函式,基本所有型別資料都通吃,除了含有迴圈巢狀的物件。
PS:
函式實現中有一行使用了 “|” 運算子,只是利用 Bitwise 運算子轉換引數為 32bit,用來確保結果是個 32位整數。
這裡是Java的直接替代品字串.hashCode()用Javascript實現的方法。
我編寫這個函式是為了滿足工作中的一個需求。顯然,後端工程師認為hashCode()是一個標準函式。這個專案的一個障礙不僅是如何翻譯Java中用來生成hashCode()的數學公式,還包括如何強制Javascript使用32位整數數學(這不是一個小的壯舉)。
幸運的是,我發現Java支援位運算子,這些運算子被限制在32位整數數學中。
下面是Javascript生成的字串原型。使用這個原型,您可以簡單地對任何字串呼叫.hashCode(),例如“some string”.hashCode(),並接收一個數字雜湊程式碼(更具體地說,是一個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; }
下面是其它網友的補充
hashCode = function(str){ var hash = 0; if (str.length == 0) return hash; for (i = 0; i < str.length; i++) { char = str.charCodeAt(i); hash = ((hash<<5)-hash)+char; hash = hash & hash; // Convert to 32bit integer } return hash; } djb2Code = function(str){ var hash = 5381; for (i = 0; i < str.length; i++) { char = str.charCodeAt(i); hash = ((hash << 5) + hash) + char; /* hash * 33 + c */ } return hash; } sdbmCode = function(str){ var hash = 0; for (i = 0; i < str.length; i++) { char = str.charCodeAt(i); hash = char + (hash << 6) + (hash << 16) - hash; } return hash; } loseCode = function(str){ var hash = 0; for (i = 0; i < str.length; i++) { char = str.charCodeAt(i); hash += char; } return hash; }
以上就是javascript的hashCode函式實現程式碼小結的詳細內容,更多關於javascript hashCode的資料請關注我們其它相關文章!