汇编刚学跳跃表,发现跳跃表与hash有着数不清的关系

维基百科:

哈希表哈希映射)是实现关联数组抽象数据类型数据结构,该结构可以将映射到。哈希表使用哈希函数来计算阵列的索引,从中可以找到所需的值。

理想情况下,散列函数会将每个密钥分配给一个唯一的存储桶,但大多数散列表设计采用不完美的散列函数,这可能会导致散列冲突,其中散列函数为多个密钥生成相同的索引。必须以某种方式适应这种碰撞。

在尺寸合适的哈希表中,每次查找的平均成本(指令数)与表中存储的元素数无关。许多哈希表设计还允许键值对的任意插入和删除,在(摊销[2])每个操作的恒定平均成本。[3][4]

在许多情况下,哈希表平均比搜索树或任何其他查找结构更有效。因此,它们被广泛用于多种计算机软件中,特别是用于关联数组数据库索引高速缓存集合

处理跳跃表,哈希表是一个实现方式,哈希表是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做哈希表,也叫散列表。

哈希是大数据技术的基础,大家应该都有了解了,这里就不深度展开了,算法导论有一章已经讲得非常清楚了,这里说说我觉得比较有意思的一个哈希的东西。

哈希表的核心是哈希算法,一个好的哈希算法可以让碰撞产生得更少,查找速度越接近于O(1),所以一个好的哈希算法非常重要。

哈希算法很多,说都说不完,不同的算法适应不同的场景,我知道的,传说中有一个哈希算法,来自魔兽世界(!!!!为了部落!!!!),号称暴雪哈希,该算法产生的哈希值完全无法预测,被称为"One-Way Hash"( A one-way hash is a an algorithm that is constructed in such a way that deriving the original string (set of strings, actually) is virtually impossible)。

// 初始化hash计算需要的基础map table
func initCryptTable() {
var seed, index1, index2 uint64 = 0x00100001, ,
i :=
for index1 = ; index1 < 0x100; index1 += {
for index2, i = index1, ; i < ; index2 += 0x100 {
seed = (seed* + ) % 0x2aaaab
temp1 := (seed & 0xffff) << 0x10
seed = (seed* + ) % 0x2aaaab
temp2 := seed & 0xffff
cryptTable[index2] = temp1 | temp2
i +=
}
}
} // hash, 以及相关校验hash值
func HashKey(lpszString string, dwHashType int) uint64 {
i, ch := ,
var seed1, seed2 uint64 = 0x7FED7FED, 0xEEEEEEEE
var key uint8
strLen := len(lpszString)
for i < strLen {
key = lpszString[i]
ch = int(toUpper(rune(key)))
i +=
seed1 = cryptTable[(dwHashType<<)+ch] ^ (seed1 + seed2)
seed2 = uint64(ch) + seed1 + seed2 + (seed2 << ) +
}
return uint64(seed1)
}

跳表的平均时间复杂度为O(logN) ,虽然有点迷。。

跳跃表&hash的更多相关文章

  1. 基于跳跃表的 ConcurrentSkipListMap 内部实现(Java 8)

    我们知道 HashMap 是一种键值对形式的数据存储容器,但是它有一个缺点是,元素内部无序.由于它内部根据键的 hash 值取模表容量来得到元素的存储位置,所以整体上说 HashMap 是无序的一种容 ...

  2. [Redis]Redis的设计与实现-链表/字典/跳跃表

    redis的设计与实现:1.假如有一个用户关系模块,要实现一个共同关注功能,计算出两个用户关注了哪些相同的用户,本质上是计算两个用户关注集合的交集,如果使用关系数据库,需要对两个数据表执行join操作 ...

  3. redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表

    1.动态字符串 redis中使用c语言的字符床存储字面量,默认字符串存储采用自己构建的简单动态字符串SDS(symple dynamic string) redis包含字符串的键值对都是用SDS实现的 ...

  4. redis的跳跃表

    跳跃表是一种插入.查询.删除的平均时间复杂度为O(nlogn)的数据结构,在最差情况下是O(n),当然这几乎很难出现. 和红黑树相比较 最差时间复杂度要差很多,红黑树是O(nlogn),而跳跃表是O( ...

  5. Redis学习之zskiplist跳跃表源码分析

    跳跃表的定义 跳跃表是一种有序数据结构,它通过在每个结点中维持多个指向其他结点的指针,从而达到快速访问其他结点的目的 跳跃表的结构 关于跳跃表的学习请参考:https://www.jianshu.co ...

  6. redis源码分析之数据结构:跳跃表

    跳跃表是一种随机化的数据结构,在查找.插入和删除这些字典操作上,其效率可比拟于平衡二叉树(如红黑树),大多数操作只需要O(log n)平均时间,但它的代码以及原理更简单. 和链表.字典等数据结构被广泛 ...

  7. Redis数据结构之跳跃表-skiplist

    在Redis中,zset是一个复合结构: 使用hash来存储value和score的映射关系 使用跳跃表来提供按照score进行排序的功能,同时可以指定score范围来获取value列表 结构 zse ...

  8. Redis源码解析:05跳跃表

    一:基本概念 跳跃表是一种随机化的数据结构,在查找.插入和删除这些字典操作上,其效率可比拟于平衡二叉树(如红黑树),大多数操作只需要O(log n)平均时间,但它的代码以及原理更简单.跳跃表的定义如下 ...

  9. 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等

    redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...

随机推荐

  1. Connection Phase Packets

    Connection Phase Packets https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet ...

  2. Transforming Auto-encoders

    http://www.cs.toronto.edu/~hinton/absps/transauto6.pdf The artificial neural networks that are used ...

  3. Eclipse中同时打开多个Console

    实现方法: 1.点击Open Console案例下拉三角,选择New Console View. 2.点击Pin Console按钮將两个控制台同时固定住. 3.点击Display Selected ...

  4. 2 Maven使用入门

    一.编写pom.xml文件     Maven项目的核心是pom.xml.POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等. ...

  5. ubuntu下安装android模拟器genymotion【转】

    本文转载自:http://www.jianshu.com/p/e6062ebb8fc9 去genymotion下载对应的安装包genymotion-2.4.0_x64.bin sudo ./genym ...

  6. Nginx 基本介绍

    同类产品 同类竞争产品,Apache,Tomcat,IIS等. Tomcat面向Java. IIS只能在Windows上运行. Apache有很多优点,稳定,开源,跨平台.但是它比较重,而且不支持高并 ...

  7. docker安装mysql挂载宿主本地目录资源后无法启动的问题

    可能是权限问题,添加--privileged=true参数: docker run -p : --name zsmysql -v $PWD/data:/var/lib/mysql -v $PWD/lo ...

  8. 机器学习 : 高斯混合模型及EM算法

    Mixtures of Gaussian 这一讲,我们讨论利用EM (Expectation-Maximization)做概率密度的估计.假设我们有一组训练样本x(1),x(2),...x(m),因为 ...

  9. kali-linux简单学习(二)

    一.SET 社会工程学工具包有一个叫devolution. 启动 setoolkit 里面可以进行一些钓鱼攻击. tabnabbing  attack这种方式是完整克隆一个网站挂到SET创建的web服 ...

  10. BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量

    BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路 ...