Small byte-sized generic key-value map type for Rust
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Avril 2afba2952b
Create LICENSE
4 years ago
src fix doc example 4 years ago
.gitignore initial commit 4 years ago
Cargo.toml fix doc example 4 years ago
LICENSE Create LICENSE 4 years ago
README.md fix doc example 4 years ago
build.rs small update 4 years ago

README.md

smallmap

A small table map using single byte key indecies. Designed for maps with tiny keys.

Pages are stored as 256 entry key-value arrays which are indexed by the byte key index. The key is compared for collision check and on collision the next page is checked or inserted if needed. smallmap does not ever need to allocate more than 1 page for types which all invariants can be represented as unique bytes.

Usage

The API is a similar subset to HashMap, containing the same insert, get, and entry functions:

fn max_char(chars: &str) -> (char, usize)
{
    let mut map = Map::new();
    for x in chars.chars() {
		*map.entry(x).or_insert(0usize) += 1;	
    }

	map.into_iter().max_by_key(|&(_, v)| v).unwrap_or_default()
}

Use cases

Designed for instances where you want a small map with relatively trivial keys (e.g. primitive type). Performance can greately outpace hash-based by an order of magnitude or more in these cases.

Maybe use if

  • You have small keys
  • Your map is not at risk of Denial of Service attacks.
  • Your keys will have a lot of collisions

Don't use if

  • You have complex keys
  • Denial of service is a concern
  • Your map will contain a large volume of entries
  • Your keys may have a large number of collisions when represented as u8.

Benchmarks

Some crude and basic benchmarks

char

Which ns/iter
HashMap 16
smallmap::Map 7

Iterating a string's chars and counting each

Which ns/iter
HashMap 8,418
BTreeMap 9,742
smallmap::Map 4,416

u8

Which ns/iter
HashMap 15
smallmap::Map 2

License

MIT licensed