Baike.dev
All toolsOnline toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
E

emhash

> 编程语言
Open source

Fast and memory efficient c++ flat hash table/map/set

721 stars0 likes0 views
WebsiteGitHub

About

Fast and memory efficient c++ flat hash table/map/set

emhash

High-performance, memory-efficient C++ open addressing flat hash table emhash is a family of high-performance, header-only hash table implementations designed for maximum performance and memory efficiency. Through innovative collision resolution strategies and cache optimization techniques, emhash demonstrates exceptional performance across various benchmarks.


Table of Contents

  • Core Features
  • Quick Start
  • Version Selection Guide
  • Testing
  • Documentation
  • Third-Party Benchmarks
  • License

Core Features

Extreme Performance

  • High load factor support: Set load factor up to 0.999 via EMH_HIGH_LOAD macro (available in hash_table5/7/8) or max_load_factor() (emhash6/7)
  • No tombstones: Performance does not degrade even with frequent insert/erase operations
  • Smart collision resolution: Three-way hybrid strategy combining linear probing, quadratic probing, and bidirectional search
  • Cache-friendly design: Single array inline storage minimizes memory footprint and maximizes cache hit rate

Memory Optimization

  • Compact layout: Significant memory savings when sizeof(key) % 8 != sizeof(value) % 8
    • Example: hash_map saves 1/3 memory compared to hash_map
  • Dynamic shrinking: shrink_to_fit() releases unused memory

Extended Features

Feature Description
insert_unique Direct insertion without lookup (performance boost)
try_get Returns pointer to value, nullptr if key not found
try_set Set value if key exists, do nothing if it doesn't (emhash5/8, emilib1/2/3)
set_get Updates value and returns old value (emhash5/8, emilib1/2/3)
_erase Delete operation returning void (faster)
LRU Mode Enable LRU cache optimization with EMH_LRU_SET

Platform Support

  • Operating Systems: Windows, Linux, macOS
  • Processors: x86_64, ARM64 (Apple M1/M2, AMD, Intel)
  • Compilers: GCC, Clang, MSVC (C++17/20)

Quick Start

1. Include Header

emhash is header-only — just copy one .hpp file to your project:

…
cpp
#include "emhash/hash_table7.hpp"  // Or emhash/hash_table[5-8].hpp

2. Basic Usage

…

More examples: docs/examples/


Version Selection Guide

30-Second Quick Guide

If you're not sure which version to use, start with emhash7 — no tombstones means stable performance under mixed insert/erase workloads, with native high load factor support (0.9+).

Choose by your primary workload pattern, not key type:

…

Detailed Comparison

Version Best For Key Strengths Weaknesses
emhash5 Small tables, memory-constrained Small-size optimization (EMH_SMALL_SIZE), 3-way hybrid probing Slower than emhash6 at high load factor
emhash6 Find/erase-heavy, integer keys Bitmask-accelerated empty-slot search, fastest find/erase Extra memory for bitmask array
emhash7 General purpose, mixed workloads Chain repair on erase (no tombstones), stable at 0.9+ LF Erase slightly slower than emhash5/6
emhash8 Iteration-heavy, large KV types Split-index + dense pairs, sequential iteration, fast copy/move Extra memory for separate index array
emilib2/3 Read-heavy at scale (GCC) SIMD group probing (16 buckets/cycle), excellent iteration Tombstone accumulation under mixed workloads; insert slower on Clang; emilib2ss may hang under extreme hash collision attack — use emilib2o or emilib2s
emilib4 Experimental Swiss-table variant Fast insert on Clang, dense iteration Tombstone accumulation (no backward shift); no try_set/set_get/_erase; fixed LF 0.875

Feature Matrix

Feature emhash5 emhash6 emhash7 emhash8 emilib1/2/3 emilib4
High load factor (0.9+) ✅ ✅ ✅ ✅ ✅ ❌
try_set ✅ ❌ ❌ ✅ ✅ ❌
set_get ✅ ❌ ❌ ✅ ✅ ❌
Custom allocator ✅ ✅ ✅ ✅ ❌ ❌
SIMD acceleration ❌ ❌ ❌ ❌ ✅ ✅
No tombstones ✅ ✅ ✅ ✅ ❌ ❌
Dense pairs iteration ❌ ❌ ❌ ✅ ✅ ✅

See Performance Overview for detailed benchmark numbers.


Testing

The test suite is in tests/ and requires no third-party dependencies — only emhash/emilib headers.

Quick Start

bash
cd tests

# Build all tests
cmake -B build && cmake --build build --config Release

# Run via custom targets
cmake --build build --target quick_test    # Unit + memory tests (fast feedback)
cmake --build build --target stress_test   # Stress tests
cmake --build build --target attack_test   # Hash attack tests
cmake --build build --target all_tests     # All tests

Test Categories

Category Directory Description
Unit tests/unit/ CRUD, iterators, copy/move, edge cases, full API coverage
Memory tests/memory/ ASan/MSan/UBSan, leak detection, lifecycle audit
Stress tests/stress/ High load factor, bad hash, randomized stress
Attack tests/attack/ Hash collision attacks (constant/small-range/linear)
Fuzz tests/fuzz/ LibFuzzer + ASan fuzzing (requires clang)

See tests/README.md for detailed instructions.


Documentation

Document Description
Test Suite Test organization, build instructions, coverage matrix
Test Analysis & Coverage Report Per-file coverage data, test classification, CI integration
Performance Overview Benchmark results, high load factor performance
API Reference Constructors, methods, iterators
Design Principles Collision resolution, memory layout, implementation comparison
Usage Notes Thread safety, reference stability, iteration, large values
Performance Tips Compile flags, pre-allocation, hash selection, anti-patterns
FAQ Frequently asked questions
Migration Guide Migrating from std::unordered_map
Performance Tracking Version-by-version benchmark history, regression policy
Architecture Decisions (ADR) Why we chose open addressing, header-only, emhash8 layout, etc.

Third-Party Benchmarks

emhash has been validated by multiple well-known third-party benchmarks:

  • Martin Ankerl's Hashmap Benchmark - Comprehensive performance testing
  • Jackson Allan's C/C++ Hash Tables Benchmark - Multi-dimensional comparison

Benchmark Code

  • Comprehensive Benchmark
  • High Load Test

Performance Charts

Historical performance charts are available in docs/images/:

  • int64_t*.png - Integer key benchmarks
  • string*.png - String key benchmarks
  • int_string.png - Mixed key/value type benchmarks

Interactive Performance Charts

Download all files in the bench/tsl_bench/ directory and open chartsAll.html in a browser to view interactive performance curves.


License

This project is open-sourced under the MIT License.

…

Acknowledgments

Thanks to the following projects and authors for inspiration and comparison:

  • martinus/robin-hood-hashing
  • greg7mdp/parallel-hashmap
  • Tessil/hopscotch-map
  • ska::flat_hash_map
  • wyhash — integrated directly into config.hpp (no external dependency required); pass -DEMH_NO_BUILTIN_WYHASH to use your own wyhash.h

Issues· 0 open

View all issuesOpen on GitHub

No open issues yet, or sync has not completed.

> Tags

C++

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category编程语言
PricingOpen source

> Related tools

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言