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:

  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哈希函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值