怎么实现一个支持高并发，高性能的hashmap？
可以看看Ankerl::unordered_dense::map是如何实现的

###  **Ankerl::unordered_dense::map**

Ankerl::unordered_dense::map 的 hash 函数选择是ankerl::unordered_dense::hash，hash函数的实现是非常高效的。Hashmap主要结构包括一个 vector 数组，存储pair{key, value} 数据，一个 array 数组存储 Buckets 。

Buckets 的主要数据结构是

            struct Bucket {        uint32_t dist_and_fingerprint;        uint32_t value_idx;    };

一共有8个字节，最高的三个字节存储的是距离第一次 hash 函数的位置。接下来一个字节存储的是 fingerprint ，低4个字节存储的是在 vector中的位置。

这个 Buckets 是为 robin-hood hashing 特别设计的冲突解决方案。bucket数组是局部有序的，由大到小排序，而且是连续内存查找，cache-locality对于cache十分友好。

###  **Insert**

Insert 操作首先通过 key 计算 hash， 通过移位获取 bucket_index, 访问当前 bucket，如果bucket没有值，直接插入即可，否则通过对比 dist_and_fingerprint 将先插入的值与 bucket 中的dist_and_fingerprint 对比，将更大的值排在前面，依次向后移动 bucket_index 以及 dist_incdist_and_fingerprint（dist_and_fingerprint + 1UL<<8）,找到对应的 buckets index 中的位置,插入时先插入 vector 中然后在插入buckets 中。

###  **Find**

Find 操作首先通过对 key 计算 hash，根据 Buckets 的个数，通过移位获得 bucket_index , 然后通过对比前32位dist_and_fingerprint ，如果相等在比较通过 value index 找到 vector 中的 key 和当前 key，如果相等则返回values，否则 buckets 数组向后移位，继续上述过程，直到 dist_and_fingerprint >bucket.dist_and_fingerprint 后退出。查找过程主要耗时在对 buckets 内的有限次顺序查找，充分利用cache-locality，性能非常不错。

###  **Iterate**

Iterate 非常简单，遍历vector即可。性能极好。