Skip to content

QianLabUCSC/Ludo

 
 

Repository files navigation

Ludo hashing

Overview

Ludo hashing is a new key-value lookup design which costs the least space (3.76 + 1.05l bits per key-value item for l-bit values) among known compact lookup solutions including the recently proposed partial-key Cuckoo and Bloomier perfect hashing. In addition to its space efficiency, Ludo Hashing works well with most practical systems by supporting fast lookups, fast updates, and concurrent writing/reading. We implement Ludo Hashing and evaluate it with both micro-benchmark and two network systems deployed in CloudLab. The results show that in practice Ludo Hashing saves 40% to 80%+ memory cost compared to existing dynamic solutions. It costs only a few GB memory for 1 billion key-value items and achieves high lookup throughput: over 65 million queries per second on a single node with multiple threads.

Our paper will appear in ACM SIGMETRICS 2020.

Paper Link: https://users.soe.ucsc.edu/~qian/papers/LudoHashing.pdf

Repository Structure

  • MinimalPerfectCuckoo/ Ludo hashing
  • BloomFilter/ Bloom filter
  • CuckooPresized/ Cuckoo hashing
  • Othello/ Othello hashing
  • SetSep/ SetSep

Run demo

# 0. setup 
sudo apt-get install google-perftools libgoogle-perftools-dev cmake build-essential pkgconf

# 1. build
mkdir release
cd release
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -G "CodeBlocks - Unix Makefiles" ..
make microbenchmarks -j4

# 2. run tests
./microbenchmarks

API

Here is a small example of VF's APIs.

// Ludo hashing maintenance structure, where keys are strings, 
// and values are 29-bit integers. 
ControlPlaneMinimalPerfectCuckoo<std::string, uint32_t, 29> cp(nn);  

// Insert a key-value item into Ludo
cp.insert(k, v);

// Get the maintenance structure prepared (compute a proper seed for each bucket)
cp.prepareToExport();
// Export from the maintenance structure to one lookup structure
DataPlaneMinimalPerfectCuckoo<std::string, uint32_t, 29> dp(cp);

// look $k$ up in the lookup structure
uint32_t val = dp.lookUp(k);

For more details, check out microbenchmarks.cpp. It contains methods on parallel lookup and dynamic updates.

Authors

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 98.7%
  • Other 1.3%