2011-07-26 28 views
0

我有以下C功能:的Javascript:請幫我轉換這個C函數的Javascript

unsigned int DJBHash(char* str, unsigned int len) 
{ 
    unsigned int hash = 5381; 
    unsigned int i = 0; 

    for(i = 0; i < len; str++, i++) 
    { 
     hash = ((hash << 5) + hash) + (*str); 
    } 

    return hash; 
} 

我試圖將其轉換爲JavaScript。我在與線的(*str)部分8

(`hash=((hash << 5) + hash) + (*str)`). 

我怎樣纔能有效地javascript轉換爲相同的表示如在C做麻煩嗎?

這是我做過的沙發,但它不起作用:當我向「str」添加零時,它只是將一個字符「0」添加到我的str中。我究竟做錯了什麼?

function DJBHash(str,len){ 
     var hash=5381; 
     var i=0; 

     for(i=0;i<len;i++){ 
       hash=((hash<<5)+hash)+(str+0); 
     } 
     return hash; 
} 
+2

定義「不工作」。 –

+0

嘿,當我添加零到「str」時,它只是將一個字符「0」添加到我的str ... – Eamorr

+1

*「不工作」* - 某些短語需要禁止在SO上。 – RedFilter

回答

6

有在Javascript中沒有指針。將輸入視爲字符串而不是指向字符串的指針。該字符串的長度,所以你並不需要發送一個參數,字符串對象具有charCodeAt方法,你可以使用循環中獲取特定字符的字符代碼:

function DJBHash(str) { 
    var hash = 5381; 
    for(var i = 0; i < str.length; i++) { 
    hash = ((hash << 5) + hash) + str.charCodeAt(i); 
    } 
    return hash; 
} 

但是,C代碼可能依賴於int具有特定的大小(但不符合C規範),以便使用溢出將結果限制爲特定的位數。由於Javascript沒有任何整數類型,您將不得不使用整數操作來以相同的方式限制結果。這將產生一個32位結果:

function DJBHash(str) { 
    var hash = 5381; 
    for(var i = 0; i < str.length; i++) { 
    hash = (((hash << 5) + hash) + str.charCodeAt(i)) & 0xffffffff; 
    } 
    return hash; 
} 
+0

它是整個字符串的無符號整數I想要添加哈希,而不僅僅是一個char – Eamorr

+1

@Eamorr:這不是原來的C代碼。它遍歷字符串中的字符並使用字符代碼構造哈希碼。 'str'參數是一個指向'char'(byte)的指針,所以'* str'是它指向的單個'char',並且隨着'str'指針在循環中被改變,它將指向每個「char」值。 – Guffa

+0

這應該可以做到!非常感謝。我只是希望我不會在使用這個DJBHash算法的散列表中碰到太多的碰撞...... – Eamorr

1

我想你的意思是str.charCodeAt(i)而不是str+0

+0

是的,但你不能在JavaScript中執行str ++位 – hugomg

+0

實際上,它是我想要添加散列的整個字符串的unsigned int,而不僅僅是char。 – Eamorr

+0

呃,什麼是整個字符串的無符號整數?不管它是什麼,這不是你的c函數所做的。 –

0

剛剛擺脫指針有心計的,只有i重複使用:

for(i = 0; i < len; i++) 
{ 
     hash = ((hash << 5) + hash) + (str.charAt(i)); 
} 
+0

恐怕你可能會在charAt():)的數值上感到失望 –

+0

它是整個字符串的無符號整數我想添加散列,而不僅僅是一個字符 – Eamorr