1. 程式人生 > 程式設計 >javascript的hashCode函式實現程式碼小結

javascript的hashCode函式實現程式碼小結

為了使用的方便,稍稍再改良了一下

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的資料請關注我們其它相關文章!