了解一个C函数的c#翻译

本文关键字:函数 翻译 一个 了解 | 更新日期: 2023-09-27 18:17:41

我正在检查一些从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函数的c#翻译

不,它不是向后循环遍历数据。它从数据的开头开始,并按顺序索引。

可以看到,这里的指针"blocks"已经超前于"data"。

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

所以,你需要一个负索引来到达数据的开始(-nblocks)。数据的起点恰好是"blocks[-nblocks]"。for循环从这里开始,然后开始计数。

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

blocksdata之前被nblocks初始化(假设sizeof(uint32_t) == 4)。然后,for循环从data开始,直到blocks指向的末尾,因此使用负索引。因此,它不是向后循环遍历数据,而是向前循环。

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