2011-07-26 5 views
0

다음 C 함수가 있습니다.자바 스크립트 :이 C 함수를 자바 스크립트로 변환하도록 도와주세요.

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의 문제가있다.

을 효율적으로C에서 행해지는 것과 같은 표현으로 변환 할 수 있을까?

다음은 sofar에서했던 것입니다.하지만 작동하지 않습니다. "str"에 0을 추가하면 단순히 str에 "0"문자가 추가됩니다. 내가 뭘 잘못하고 있죠?

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을 더하면 단순히 "0"을 내 str에 추가한다. – Eamorr

+1

* "작동하지 않는다"* - 특정 어구는 금지되어 있어야한다. – RedFilter

답변

6

자바 스크립트에는 포인터가 없습니다. 입력을 문자열에 대한 포인터 대신 문자열로 취급하십시오. 문자열 길이를 가지고, 그래서 당신은 매개 변수로 그를 보낼 필요가없고, 문자열 객체를 사용하면 루프 동안 특정 문자의 문자 코드를 얻을하는 데 사용할 수있는 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

전체 문자열의 부호없는 int 인 경우 – Eamorr

+1

@Eamorr : 그것은 원래의 C 코드가하는 것이 아닙니다. 문자열의 문자를 반복하고 문자 코드를 사용하여 해시 코드를 생성합니다. 'str' 매개 변수는'char' (byte)에 대한 포인터이므로'* str'은 포인터가 가리키는 하나의'char'이며,'str' 포인터가 루프에서 변경되면 포인터는 각각의'char' 값을 차례로 호출합니다. – Guffa

+0

그 트릭을해야합니다! 많은 감사합니다. 이 DJBHash 알고리즘을 사용하여 내 해시 테이블에서 너무 많은 충돌을 얻지 않기를 바란다. – Eamorr

1

난 당신이 str.charCodeAt(i)하지 str+0 의미 생각합니다.

+0

그래,하지만 당신은 자바에서 str ++ 비트를 할 수 없다. – hugomg

+0

사실, 전체 문자열의 부호없는 int이다. char가 아니라 hash를 추가하고 싶다. – Eamorr

+0

Earmorr, 전체 문자열의 부호없는 int는 무엇입니까? 그것이 무엇이든, 그것은 당신의 c 함수가하는 것이 아닙니다. –

0

그냥 포인터 헛소리 없애, 오직 i 사용하여 반복 :

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

charAt()의 숫자 값에 실망 할 수도 있습니다. :) –

+0

전체 문자열의 부호없는 정수입니다. 해시를 추가 할 때만 아니라 문자를 – Eamorr

관련 문제