Crates.io | inturn |
lib.rs | inturn |
version | 0.1.2 |
created_at | 2025-06-06 19:54:21.405+00 |
updated_at | 2025-08-23 12:59:06.447465+00 |
description | Efficient, performant, thread-safe bytes/string interning |
homepage | https://github.com/danipopes/inturn |
repository | https://github.com/danipopes/inturn |
max_upload_size | |
id | 1703389 |
size | 44,516 |
Efficient, performant, thread-safe bytes/string interning.
This crate was designed to have a lock-free mapping of symbols back to their original string.
It currently uses dashmap
for deduplicating strings,
and a lock-free stack to map the string index (symbol) back to the string bytes.
It supports interning any &str
/&[u8]
by allocating it internally in an efficient arena when encountered for the first time,
or &'static str
/&'static [u8]
without allocation.
A *_mut
variant of each API is provided which side-step any locks,
for e.g. initializing the interner with a static set of strings to pre-intern.
Basic str
interning (the same API is available with BytesInterner
for [u8]
):
use inturn::Interner;
let interner = Interner::new();
let hello = interner.intern("hello");
assert_eq!(hello.get(), 0);
assert_eq!(interner.resolve(hello), "hello");
let world = interner.intern("world");
assert_eq!(world.get(), 1);
assert_eq!(interner.resolve(world), "world");
let hello2 = interner.intern("hello");
assert_eq!(hello, hello2);
assert_eq!(interner.len(), 2);