Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Fast & memory efficient hash tables for Java

License

NotificationsYou must be signed in to change notification settings

bluuewhale/hash-smith

Repository files navigation

License: MITMaven CentraljavadocStatus: experimental

HashSmith logo

Overview

  • HashSmith provides multiple high-performance hash table implementations optimized for speed and memory efficiency on modern JVMs.
  • Focus areas: SWAR-probing (SwissMap), SIMD-probing (SwissSimdMap), predictable probe lengths (Robin Hood), and minimal per-entry overhead.
  • Built for JDK 21+;SwissSimdMap uses the incubating Vector API for SIMD acceleration.
  • More memory-efficient than the built-in JDKHashMap; performance depends on workload.

Implementations

  • SwissMap: SwissTable-inspired design using SWAR control-byte probing (no Vector API) with tombstone reuse. Default map.
  • SwissSimdMap: SIMD (Vector API incubator) variant of SwissMap with vectorized control-byte probing. Seedocs/SwissSimdMap.md for details.
  • ConcurrentSwissMap: sharded, thread-safe wrapper aroundSwissMap using per-shardStampedLock (null keys not supported).
  • SwissSet: SwissTable-style hash set with SIMD control-byte probing, tombstone reuse, and null-element support

Why SWAR by default?

Vector API is still incubating, and profiling on my setup showed the SIMD path taking longer than expected, so the defaultSwissMap favors a SWAR probe. Numbers can differ significantly by hardware/JVM version; please run your own benchmarks if you plan to useSwissSimdMap.

Blog / Write-up

  • If you want a guided tour with design notes and benchmarks, seethis write-up.

Quick Start

import io.github.bluuewhale.hashsmith.SwissMap;      // SWARimport io.github.bluuewhale.hashsmith.ConcurrentSwissMap;import io.github.bluuewhale.hashsmith.SwissSet;// SwissMap (SWAR)var swiss = new SwissMap<String, Integer>();swiss.put("a", 1);swiss.get("a"); // 1// ConcurrentSwissMap (sharded, thread-safe)var concurrentSwiss = new ConcurrentSwissMap<String, Integer>();concurrentSwiss.put("a", 1);concurrentSwiss.get("a"); // 1// SwissSetvar swissSet = new SwissSet<String>();swissSet.add("k");swissSet.add(null); // nulls allowedswissSet.contains("k"); // true

Install

  • Gradle (Kotlin DSL):
dependencies {    implementation("io.github.bluuewhale:hashsmith:0.1.8")}
  • Gradle (Groovy):
dependencies {    implementation 'io.github.bluuewhale:hashsmith:0.1.8'}
  • Maven:
<dependency>  <groupId>io.github.bluuewhale</groupId>  <artifactId>hashsmith</artifactId>  <version>0.1.8</version></dependency>

Requirements

  • JDK 21+ (SwissSimdMap needsjdk.incubator.vector)
  • Gradle (wrapper provided)
  • The JVM flag--add-modules jdk.incubator.vector is already configured for build, test, and JMH tasks that exerciseSwissSimdMap.

Build & Test

./gradlew build        # full build./gradlew test         # JUnit 5 tests

Memory Footprint

  • Compares retained heap for both maps (HashMap vsSwissSimdMap vsSwissMap vs fastutilObject2ObjectOpenHashMap vs Eclipse CollectionsUnifiedMap) and sets (HashSet vsSwissSet vs fastutilObjectOpenHashSet vs Eclipse CollectionsUnifiedSet).
  • Set benchmarks use UUIDString keys (HashSet, SwissSet, ObjectOpenHashSet, UnifiedSet). Primitive-specialized collections (e.g., fastutil primitive sets) are excluded because their memory profile is driven by primitive storage, whereas these tests target general reference workloads.

Results

  • Maps:SwissMap/SwissSimdMap use open addressing to cut space; default load factor 0.875, up to 53.3% retained-heap reduction in payload-light cases vsHashMap.
  • Sets:SwissSet (SwissHashSet) mirrors the SwissTable layout with SIMD control-byte probing and reuses tombstones to stay denser thanHashSet across tested payloads, showing up to ~62% retained-heap reduction in lighter payload cases.
MapSet
HashMap Memory FootprintHashSet Memory Footprint

Benchmark (JMH, CPU ns/op)

  • All benchmarks were run on Windows 11 (x64) with Eclipse Temurin JDK 21.0.9, on an AMD Ryzen 5 5600 (6C/12T).
  • At high load factors SwissMap (SWAR) stay competitive against other open-addressing tables and close to JDK HashMap performance; depending on hardware/JVM, one may edge out the other.
put hitput miss
CPU: put hitCPU: put miss
get hitget miss
CPU: get hitCPU: get miss

Contributing

  1. Open an issue for bugs/ideas
  2. Work on a feature branch and open a PR
  3. Keep tests/JMH green before submitting

License

  • This project is licensed under the MIT License. SeeLICENSE for details.

About

Fast & memory efficient hash tables for Java

Topics

Resources

License

Stars

Watchers

Forks

Contributors3

  •  
  •  
  •  

Languages


[8]ページ先頭

©2009-2026 Movatter.jp