• 对于字符串,所用的hash函数为:

    size_t _Hash_bytes(const void* ptr, size_t len, size_t seed) {

    static const size_t mul = (((size_t) 0xc6a4a793UL) << 32UL)

    + (size_t) 0x5bd1e995UL;

    const char* const buf = static_cast<const char*>(ptr);

     
     

    // Remove the bytes not divisible by the sizeof(size_t). This

    // allows the main loop to process the data as 64-bit integers.

    const int len_aligned = len & ~0x7;

    const char* const end = buf + len_aligned;

    size_t hash = seed ^ (len * mul);

    for (const char* p = buf; p != end; p += 8)

    {

    const size_t data = shift_mix(unaligned_load(p) * mul) * mul;

    hash ^= data;

    hash *= mul;

    }

    if ((len & 0x7) != 0)

    {

    const size_t data = load_bytes(end, len & 0x7);

    hash ^= data;

    hash *= mul;

    }

    hash = shift_mix(hash) * mul;

    hash = shift_mix(hash);

    return hash;

    }

    其中ptr="VOA",len=3,seed=3339675911,返回的hash值为5877402447214576471,模11后,得到bucket位置为6。

  • 默认的hash表桶数为11。
  • unordered_set的实现,在insert调用栈中,会最终调用到:

    __node_type* __n = _M_find_node(__bkt, __k, __code),如果__k是首次插入,__n会等于nullptr,此时会转入__n = __node_gen(std::forward<_Arg>(__v)),即生成新的_Hash_node。如果__n不为nullptr,说明之前已有同样元素存在。

  • 如果hash表元素是int,那么会生成一个为其特化的hashtable,其hash值不需要计算,而是直接用value % 11得到其__bkt值,进而插入hash表。

     
     

     
     

Hash Table Implementation in C++的更多相关文章

  1. Hash table lengths and prime numbers

    Website:http://srinvis.blogspot.ca/2006/07/hash-table-lengths-and-prime-numbers.html This has been b ...

  2. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  3. 哈希表(Hash Table)

    参考: Hash table - Wiki Hash table_百度百科 从头到尾彻底解析Hash表算法 谈谈 Hash Table 我们身边的哈希,最常见的就是perl和python里面的字典了, ...

  4. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  5. 几种常见 容器 比较和分析 hashmap, map, vector, list ...hash table

    list支持快速的插入和删除,但是查找费时; vector支持快速的查找,但是插入费时. map查找的时间复杂度是对数的,这几乎是最快的,hash也是对数的.  如果我自己写,我也会用二叉检索树,它在 ...

  6. PHP内核探索之变量(3)- hash table

    在PHP中,除了zval, 另一个比较重要的数据结构非hash table莫属,例如我们最常见的数组,在底层便是hash table.除了数组,在线程安全(TSRM).GC.资源管理.Global变量 ...

  7. php Hash Table(四) Hash Table添加和更新元素

    HashTable添加和更新的函数: 有4个主要的函数用于插入和更新HashTable的数据: int zend_hash_add(HashTable *ht, char *arKey, uint n ...

  8. php Hash Table(一) Hash Table的结构

    关于Hash Table专题: 一直想深入理解一下php的hash table的实现,以前一直是星星点点的看看,从未彻底的总结过,那就从这个专题开始吧! 主要想总结几个部分:hashtable结构,h ...

  9. Hash Table 的实现步骤是什么

    什么是HashTable Hash Table 是计算机科学中很重要的一种数据结构,其时间复杂度为O(1),主要是通过把关键字Key 映射到数组中的一个位置来访问记录,所以速度相当快.映射函数称为 H ...

随机推荐

  1. rabbitmq+haproxy+keepalived高可用集群环境搭建

    1.先安装centos扩展源: # yum -y install epel-release 2.安装erlang运行环境以及rabbitmq # yum install erlang ... # yu ...

  2. 判断是手机端还是PC短访问

    第一种:判断是手机访问还是PC访问 <script> function browserRedirect() { var sUserAgent = navigator.userAgent.t ...

  3. Linux、Windows 和 Mac 中的换行符对比

    原文地址:Linux.Windows 和 Mac 中的换行符对比 博客地址:http://www.moonxy.com 一.前言 经常使用 Window.Linux 等不同操作系统的开发者,在处理文本 ...

  4. Layer弹层(父子传值,兄弟传值)

    需求:最外面列表界面点修改弹出LayerA界面,再点击LayerA界面中的选择地图坐标按钮弹出LayerB地图界面 这个过程涉及到的: 1:LayerA将坐标传给LayerB,LayerB在地图上显示 ...

  5. IT修养-基础篇

    1.科学基础 成为开发人员的过程不尽相同,有的是科班出身,有的是兴趣爱好,还有的是专业机构的培训,在这个过程中,可能全面或者零散甚至没有学习过计算机基础学科,但无论是哪一种,想要成为更高层次的开发人员 ...

  6. CF #579 (Div. 3) B.Equal Rectangles

    B.Equal Rectangles time limit per test2 seconds memory limit per test256 megabytes inputstandard inp ...

  7. 基于操作系统的Linux网络参数的配置

    一.实验目的 1.掌握Linux下网络参数的查看方法并理解网络参数的含义. 2.掌握Linux下网络参数的配置 二.实验内容 1.查看当前网络配置的参数. 2.在Linux主机中将网络参数按以下要求设 ...

  8. javascript:history.go(-1)的使用

    1.问题描述 在微信项目开发中,比如常用联系人的增删改查操作中,比如跳入常用联系人管理页面,选中一个联系人修改它,就会跳入修改页面,修改完成后跳转到常用联系人管理页面,此时如果修改成功跳转采用的是页面 ...

  9. java 集成Redis 一主多从

    1.测试代码如下: public static void main(String[] args) { Set<String> sentinels = new HashSet<Stri ...

  10. java 对数组进行截取组合操作

    1.使用skip跳过和limit限制组合,示例: Integer skip = (page.getPageNum() - 1) * page.getPageNum(); Integer limit = ...