From fd4fe938dcda7e21faf3d446ef1aa56296f66992 Mon Sep 17 00:00:00 2001 From: greg Date: Sat, 2 Mar 2019 22:32:04 -0500 Subject: [PATCH] wip --- README.md | 2 +- diagrams/index_computation | 2 +- img/index_computation.png | Bin 14348 -> 14328 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0ab4654..78268c3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ (c) Gregory Popovitch - 2/28/2019 [tl;dr] built on top of Abseil's flat_hash_map, the parallel flat_hash_map is - more memory friendly, and can be used from multiple with high levels of + more memory friendly, and can be used from multiple threads with high levels of concurrency ### A quick look at the current state of the art diff --git a/diagrams/index_computation b/diagrams/index_computation index 8978437..5f64a47 100644 --- a/diagrams/index_computation +++ b/diagrams/index_computation @@ -8,7 +8,7 @@ | h=0x7d84ea13707f4657 | | submap0 | +---------+------------+ +----------------+ | | submap1 | - | "(h ^ (h <> 3)) & 0x7" +----------------+ + | "(h ^ (h >> 3)) & 0x7" +----------------+ | | submap2 | +----+----+ +----------------+ |"idx = 5"| | submap3 | diff --git a/img/index_computation.png b/img/index_computation.png index 8d14c36eea95e522ace7e3936fc0f076cf1a8a7b..35ba60a757de93a2eb4fce5ab71ce21d9775c969 100644 GIT binary patch literal 14328 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 Of|OIalLde5{oerPHO86%