现在的位置: 首页 > 综合 > 正文

C++ hash_map 与 Java HashMap 的区别

2012年08月20日 ⁄ 综合 ⁄ 共 790字 ⁄ 字号 评论关闭

与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:

  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 ,在我上传的资源里。




抱歉!评论已关闭.