From ab689da5fa5d41b7be75a8e23681b9f3097e9947 Mon Sep 17 00:00:00 2001 From: greg Date: Sun, 3 Mar 2019 10:34:05 -0500 Subject: [PATCH] wip --- diagrams/index_computation.svg | 132 ++++++++++++++++----------------- img/index_computation.png | Bin 15311 -> 16321 bytes 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/diagrams/index_computation.svg b/diagrams/index_computation.svg index 27aedc6..b986a93 100644 --- a/diagrams/index_computation.svg +++ b/diagrams/index_computation.svg @@ -1,4 +1,4 @@ - + @@ -56,140 +56,140 @@ } - + - - - - - - - + + + + + + + - - - - - + + + + + - - - - - - - - + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - + parallel_hash_map with 8 submaps, each submap is an absl::flat_hash_map - + h=0x7d84ea13707f4657 - -(Key, Value) + +(keyi, valuei) - + idx = 5 - + (h ^ (h >> 3)) & 0x7 - -hasher + +hasher(keyi) - + Parallel Hash Map - + (with 8 submaps) - + submap0 - + submap1 - + submap2 - + submap3 - + submap4 - + submap5 - + submap6 - + submap7 diff --git a/img/index_computation.png b/img/index_computation.png index 20c54c2a071723e73f9409796f2100351b5c6902..550d743b3e262bd9b98fade8f0fc8438893af448 100644 GIT binary patch literal 16321 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 literal 15311 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