-1

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++) ...は、データを逆方向にループしていますか? 負のインデックスで参照されるデータを見たことがありません。

4

3 に答える 3

3

いいえ、データを逆方向にループしていません。データの先頭から開始し、インデックスアップします。

ご覧のとおり、ここでポインター「ブロック」は既に「データ」を超えて進んでいます。データの先頭から「nblocks」先を指します。

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

したがって、データの先頭に到達するには負のインデックスが必要です (-nblocks)。データの開始は正確に「blocks[-nblocks]」にあります。「for」ループは単純にそこから始まり、カウントアップします。

for(i = -nblocks; i; i++)
于 2013-06-10T18:06:10.757 に答える
0

実際、これはハッシュ ( https://en.wikipedia.org/wiki/MurmurHash ) を使用するアルゴリズムです

于 2013-06-10T17:47:26.033 に答える