了解一个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++) ...
是向后循环遍历数据吗?
不,它不是向后循环遍历数据。它从数据的开头开始,并按顺序索引。
可以看到,这里的指针"blocks"已经超前于"data"。
const uint32_t * blocks = (const uint32_t *)(data + nblocks*4);
所以,你需要一个负索引来到达数据的开始(-nblocks)。数据的起点恰好是"blocks[-nblocks]"。for循环从这里开始,然后开始计数。
for(i = -nblocks; i; i++)
blocks
在data
之前被nblocks
初始化(假设sizeof(uint32_t) == 4
)。然后,for
循环从data
开始,直到blocks
指向的末尾,因此使用负索引。因此,它不是向后循环遍历数据,而是向前循环。
实际上它是一种使用散列的算法(https://en.wikipedia.org/wiki/MurmurHash),您的源可能就是那个https://github.com/JeffBezanson/libsupport/blob/master/MurmurHash3.c;)