了解C#转换的C函数

时间:2013-06-10 17:41:10

标签: c# c code-translation

我正在检查从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++) ...是否会向后循环数据?我从来没有见过带有负面索引的数据。

3 个答案:

答案 0 :(得分:3)

blocks变量在data之前由nblocks初始化(假设为sizeof(uint32_t) == 4)。然后for循环从data的开头到blocks指向的结尾开始,因此使用负索引。因此,它不会向后循环数据,而是向前循环。

答案 1 :(得分:3)

不,它没有向后循环数据。它从数据的开头开始,并编制索引。

正如您所看到的,此处指针“blocks”已经超过“数据”。它将“nblocks”指向数据的开头。

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

因此,您需要一个负索引才能到达数据的开头(-nblocks)。数据的开始恰好是“blocks [-nblocks]”。 “for”循环只是从那里开始,然后计数。

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

答案 2 :(得分:0)

实际上它是一种使用散列算法(https://en.wikipedia.org/wiki/MurmurHash),你的来源可能就是https://github.com/JeffBezanson/libsupport/blob/master/MurmurHash3.c;)