C++ hash_map 与 Java HashMap 的区别

转载:

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

  1. inline size_t __stl_hash_string(const char* __s)  
  2. {           
  3.        unsigned long __h = 0;   
  4.        for ( ; *__s; ++__s)  
  5.        __h = 5*__h + *__s;  
  6.   
  7.       return size_t(__h);  
  8. }  

  HashMap:将5换成了31。

  个人觉得,散列效果比较均匀的是DJB哈希函数。


附  :结合Java 的HashMap改造后的C++的HashMap ,在我上传的资源里。


点赞