最近遇到一个查找对应关系的需求,第一时间想到map,但是千万级的数据,于是使用了unordered_map。时间降低了3倍左右。
但是偶然看见网上有有人说手撸一个hashmap,最基本的链式的,都要比unordered_map要快,于是试了一下。
发现STL写的还挺有意思的。写说下和STL的对比。
手撸hashmap | STL-unordered_map | |
---|---|---|
底层实现 | vector<slit> | Node** |
扩展表 | 素数表 | 总元素大小除负载因子/两倍桶大小/下一个素数 |
hash函数 | (n ^ 0xdeadbeef) % curTableSize; | FNV-1a |
初始大小 | 53 | 10 |
扩展条件 | 数据量大于桶大小 | 数据量大于桶大小 |
其实实现都差不多,但是测试出来的数据却很有意思。
测试情况:
一亿的int数据
Ubuntu 14.04.5 LTS
gcc version 4.8.4
map | unordered_map | 手撸hash_map | |
---|---|---|---|
插入时间(ms) | 189264 | 55442 | 19055 |
查询时间(ms) | 98428 | 15796 | 2590 |
内存占用(M) | 4579 | 4201 | 4590 |
不知道为啥会快,也不知道为啥unordered_map内存占用会低。。。
看了源码,感觉实现的差不多啊,盲猜可能缺少了边界检查和类似的保障机制吧。
测试代码放在git上。
https://github.com/xixihahag/hash