summaryrefslogtreecommitdiff
path: root/decoder/node_state_hash.h
blob: f380fcb1a47d153b4b1ac1132a911812822bceca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef NODE_STATE_HASH_
#define NODE_STATE_HASH_

#include <cassert>
#include <cstring>
#include "tdict.h"
#include "murmur_hash3.h"
#include "ffset.h"

namespace cdec {

  struct FirstPassNode {
    FirstPassNode(int cat, int i, int j, int pi, int pj) : s(i), t(j), u(pi), v(pj) {
      memset(lhs, 0, 120);
      unsigned it = 0;
      for (auto& c : TD::Convert(-cat)) { lhs[it++] = c; if (it == 120) break; }
    }
    char lhs[120];
    short s;
    short t;
    short u;
    short v;
  };

  inline uint64_t HashNode(int cat, int i, int j, int pi, int pj) {
    FirstPassNode fpn(cat, i, j, pi, pj);
    return MurmurHash3_64(&fpn, sizeof(FirstPassNode), 2654435769U);
  }

  inline uint64_t HashNode(uint64_t old_hash, const FFState& state) {
    if (state.size() == 0) return old_hash;
    uint8_t buf[1024];
    std::memcpy(buf, &old_hash, sizeof(uint64_t));
    assert(state.size() < (1024u - sizeof(uint64_t)));
    std::memcpy(&buf[sizeof(uint64_t)], state.begin(), state.size());
    return MurmurHash3_64(buf, sizeof(uint64_t) + state.size(), 2654435769U);
  }

}

#endif