Hash算法
2016-09-08 19:35
281 查看
以前也经常用到hash算法,都是百度下,知道其大概意思,并未深刻领会其意义,这次认真学习了下,做次总结记录下。
哈希算法,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值,较常用的有MD5和SHA。
hash算法,其本质就是映射。理解了这点才能真正使用hash算法。
Java中比较常用就是hashmap,其使用原理是如何呢?
Hash本质就是映射,hashmap是以key,value形式存值的,通过将key映射后,取值就非常方便了,时间复杂度可以近似达到O(1)。(为什么是近似,稍后解释)
Hashmap会将元素存储在一个Bucket中的entry结构体中,然后将key映射到桶中单个entry中,但是当存储的值很多,则会存在多个Key 映射成同一个hashcode,hashmap采用了地址链表法解决这个问题,即
这也是为什么其时间复杂度近似O(1)。
既然hash算法这么优秀,为什么数据库索引基本用的是B+tree,而不是hash呢?这是hash算法有他的劣势,例如范围查找用hash算法就需要对整表遍历,任何数据结构和算法都是针对特定情境的。
哈希算法,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值,较常用的有MD5和SHA。
hash算法,其本质就是映射。理解了这点才能真正使用hash算法。
Java中比较常用就是hashmap,其使用原理是如何呢?
Hash本质就是映射,hashmap是以key,value形式存值的,通过将key映射后,取值就非常方便了,时间复杂度可以近似达到O(1)。(为什么是近似,稍后解释)
Hashmap会将元素存储在一个Bucket中的entry结构体中,然后将key映射到桶中单个entry中,但是当存储的值很多,则会存在多个Key 映射成同一个hashcode,hashmap采用了地址链表法解决这个问题,即
这也是为什么其时间复杂度近似O(1)。
既然hash算法这么优秀,为什么数据库索引基本用的是B+tree,而不是hash呢?这是hash算法有他的劣势,例如范围查找用hash算法就需要对整表遍历,任何数据结构和算法都是针对特定情境的。
相关文章推荐
- 查找字符串的hash算法
- 大量Hash算法的实现
- hash算法收集 (转)
- Hash算法
- 使用hash算法统计字符串中字符出现的频率
- 几种经典的Hash算法实现
- Hash算法系列-应用(负载均衡)
- 编程艺术第十六~第二十章:全排列/跳台阶/奇偶调序,及一致性hash算法
- 常见HASH算法
- java Hash算法大全(转载的)
- hash算法
- Hash算法
- 经典数据结构 [ Hash算法 ]
- 收藏一个Hash算法
- 常用Hash算法(C语言实现)
- C# Redis客户端对一致性hash算法的实现
- nyoj-138-找球号(二)----hash算法之除留余数法+vector
- 字符串的hash算法
- 字符串经典的hash算法
- hash算法