2013-06-10 4 views
-1

Я просматриваю код, который был переведен с C на 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++) ... является это зацикливание через данные в обратном направлении? Я никогда не видел данные, относящиеся к отрицательному индексу.

+1

Почему бы не отладить его или просто распечатать 'i' в начале каждого цикла, чтобы узнать, что происходит? Это должно сделать поведение довольно ясным. – Servy

+0

Я пишу на C# в Visual Studio. Я считаю, что источником является 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

У меня есть другой источник, но я считаю, что этот алгоритм довольно стандартный. В статье wiki подразумевается, что она идет вперед (я видел ее раньше), но вы подтверждаете, что она идет назад, а остальная часть находится в начале ввода, правильно? – IamIC

+3

Какая черта для '# define'? Почему они просто не сказали «p [i]»? –

+0

Интересно, что 128-битный хеш работает в обратном направлении, а 32-разрядный - вперед. – IamIC

3

Переменная blocks инициализируется перед data по nblocks (при условии, sizeof(uint32_t) == 4). Затем цикл for начинается с начала data до конца, на который указывает blocks, поэтому используются отрицательные индексы. Таким образом, он не перебирает данные назад, а вперед.

+0

Я согласен с этим двигаться вперед. –

 Смежные вопросы

  • Нет связанных вопросов^_^