转载:
http://blog.csdn.net/mdj67887500/article/details/6907702
C++ hash_map 与 Java HashMap 的区别
与Java中的HashMap比起来, C++ STL 中hash_map的实现并不是很完美。原因在于一些小的细节:
1. Hash表的增长方式:
hash_map: 当元素数量element_NUM超过桶的数量bucket_NUM 时,确定一个新的桶数量N。N是质数,它是从一个质数表中选择出来的,它必须大于等于元素数量element_NUM。质数表中的质数是从小到大排列的,基本上后一个数是前一个数的2倍。
HashMap:使用了负载因子。我们知道,负载因子=元素数量/桶数量。这里的负载因子取值为0.75。还有一个阈值的概念,阈值=桶数量*负载因子,也就是在当前桶的数量下,可以容纳的元素的最大数量。 当元素数量超过该阈值时,桶就进行扩充。每次扩充时,桶数量都变为原来的2倍。这里使用的桶数量不是质数,而是2的整数次幂。
通常情况下,在元素数量相同时,HashMap的桶数量大于hash_map,所以前者的冲突比较少。
由于使用的桶的数量是不同的值,因此就有第2个区别。
2. 由哈希值hash_code 映射到桶索引bucket_index的方式:
hash_map:模运算, bucket_index=hash_code%桶数量。
HashMap: 位运算, bucket_index=hash_code&(桶数量-1)。
3.使用的字符串哈希函数:
都是经验哈希函数。
hash_map:
[cpp]
view plain
copy
- inline size_t __stl_hash_string(const char* __s)
- {
- unsigned long __h = 0;
- for ( ; *__s; ++__s)
- __h = 5*__h + *__s;
- return size_t(__h);
- }
HashMap:将5换成了31。
个人觉得,散列效果比较均匀的是DJB哈希函数。
附 :结合Java 的HashMap改造后的C++的HashMap ,在我上传的资源里。