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 | e7993fb83537105a56c274d78ed9d51a79a8a854 (patch) | |
tree | da88ab86e1173025c40113c303f08e02e6476c14 /utils/perfect_hash.cc | |
parent | c41704e876930311539f0cfb5f5125f3401d08ae (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 |