2013-06-10 3 views
-1

C에서 C#으로 변환 된 일부 코드를 검사하고 있습니다.C# 변환을위한 C 함수 이해

... 
#define getblock(p, i) (p[i]) 
... 
void MurmurHash3_x86_32 (const void * key, int len, 
          uint32_t seed, void * out) 
{ 
    const uint8_t * data = (const uint8_t*)key; 
    const int nblocks = len/4; 
    int i; 

    uint32_t h1 = seed; 

    uint32_t c1 = 0xcc9e2d51; 
    uint32_t c2 = 0x1b873593; 

    const uint32_t * blocks = (const uint32_t *)(data + nblocks*4); 

    for(i = -nblocks; i; i++) 
    { 
    uint32_t k1 = getblock(blocks,i); 
... 

부분 for(i = -nblocks; i; i++) ...은이 거꾸로 데이터를 통해 반복 : 나는 원래 C에 대한 질문이? 데이터가 음의 색인으로 표시되는 것을 본 적이 없습니다.

+1

왜 디버그하지 않거나 각 루프의 시작 부분에'i'를 인쇄하여 어떻게됩니까? 그 행동을 분명히해야합니다. – Servy

+0

Visual Studio에서 C#으로 작성했습니다. 나는 소스가 GNU C.라고 믿는다. – IamIC

+3

그래서 원래의 코드를 실행하는 데 아무런 의미가 없다? 당신이 재 작성을하고 있다면 나는 그것을 고치는 방법을 발견 할 것이다. 코드의 내용을 이해하는 데 도움이되도록 번역중인 코드 스 니펫을 실행할 수 있어야합니다. C 코드를 전혀 실행할 수 없다는 것이 여전히 나쁘고, 해결하기가 너무 어렵지 않아야합니다. – Servy

답변

3

아니요 데이터를 거꾸로 반복하지 않습니다. 그것은 데이터의 시작 부분에서 시작하여 인덱스를 작성합니다.

여기서 볼 수 있듯이 "블록"포인터는 이미 "데이터"를지나 진행됩니다. 데이터의 시작 부분을지나 "nblocks"를 가리 킵니다.

const uint32_t * blocks = (const uint32_t *)(data + nblocks*4); 

따라서 데이터의 시작 부분 (-nblocks)으로 이동하려면 음수 인덱스가 필요합니다. 데이터의 시작 부분은 정확히 "blocks [-nblocks]"입니다. "for"루프는 단순히 거기에서 시작하고 카운트 업합니다.

for(i = -nblocks; i; i++) 
+0

그런데 왜 그걸 할 건가요? 명시 적으로 데이터의 끝을 가리킨 다음 음수 인덱스를 사용하여 트래버스하는 방법으로 얻는 것은 무엇입니까? –

+0

그는 일부 기존 코드로 작업하고 있습니다.어떤 프로그래머는 이런 식으로하기로 결정했습니다. – Ziffusion

+0

음, 그렇습니다. 하지만 왜? 왜 누군가가 그렇게했을까요? 이 기법으로 얻을 수있는 것이 있습니까? 아니면 완전히 영리하다고 생각하는 것입니까? –

0

이 사실이 알고리즘을 사용하는 해시 (https://en.wikipedia.org/wiki/MurmurHash)의, 소스가 하나 https://github.com/JeffBezanson/libsupport/blob/master/MurmurHash3.c 것을 수 있습니다)

+0

나는 다른 출처를 가지고 있지만, 나는이 알고리즘이 꽤 표준이라고 생각한다. 위키 기사는 그것이 앞으로 나아갈 것임을 암시합니다 (이전에 보았습니다). 그러나 여러분은 그것이 나머지 부분이 입력의 시작 부분에있는 것을 확인하면서 거꾸로 가고 있음을 확인하고 있습니까? – IamIC

+3

'# define '은 무엇을 대체합니까? 왜 그들은 단지'p [i]'라고 말하지 않았을까요? –

+0

흥미로운 점은 128 비트 해시가 역방향으로 실행되지만 32 비트는 앞으로 진행된다는 점입니다. – IamIC

3

blocks 변수가 nblocks 앞두고 data의 초기화() sizeof(uint32_t) == 4 가정. 그런 다음 for 루프는 data의 시작 부분에서 blocks을 가리키는 끝까지 시작하므로 음수 인덱스가 사용됩니다. 따라서 데이터를 거꾸로 반복하지 않지만 전달합니다.

+0

전진하면서 동의합니다. –