diff options
author | Chris Dyer <cdyer@cs.cmu.edu> | 2011-09-13 13:25:46 +0100 |
---|---|---|
committer | Chris Dyer <cdyer@cs.cmu.edu> | 2011-09-13 13:25:46 +0100 |
commit | 38a5bee71f6b49515cd105a9467ff602ff9dee64 (patch) | |
tree | 9e17da6cf072beb0150d82fee1d8e4756c8f0253 /utils/perfect_hash.cc | |
parent | b09ca8a5e6f5e8c1840e51a93c9f8e6b8c4bcc33 (diff) |
optional support for doing perfect hashing of feature strings to save lots of memory
Diffstat (limited to 'utils/perfect_hash.cc')
-rw-r--r-- | utils/perfect_hash.cc | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/utils/perfect_hash.cc b/utils/perfect_hash.cc new file mode 100644 index 00000000..706e2741 --- /dev/null +++ b/utils/perfect_hash.cc @@ -0,0 +1,37 @@ +#include "config.h" + +#ifdef HAVE_CMPH + +#include "perfect_hash.h" + +#include <cstdio> +#include <iostream> + +using namespace std; + +PerfectHashFunction::~PerfectHashFunction() { + cmph_destroy(mphf_); +} + +PerfectHashFunction::PerfectHashFunction(const string& fname) { + FILE* f = fopen(fname.c_str(), "r"); + if (!f) { + cerr << "Failed to open file " << fname << " for reading: cannot load hash function.\n"; + abort(); + } + mphf_ = cmph_load(f); + if (!mphf_) { + cerr << "cmph_load failed on " << fname << "!\n"; + abort(); + } +} + +size_t PerfectHashFunction::operator()(const string& key) const { + return cmph_search(mphf_, &key[0], key.size()); +} + +size_t PerfectHashFunction::number_of_keys() const { + return cmph_size(mphf_); +} + +#endif |