hash函数

为什么HashMap的初始容量是16

依然范特西╮ 提交于 2019-12-03 19:37:18
到底什么是hash呢?hash碰撞?为什么HashMap的初始容量是16? https://blog.csdn.net/qq_35583089/article/details/80048285 一 ,到底什么是hash呢? 作者:知乎用户 链接:https://www.zhihu.com/question/26762707/answer/40119521 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 hash(散列、杂凑)函数,是将任意长度的数据映射到有限长度的域上。直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹)。 也就是说,无论数据块m有多大,其输出值h为固定长度。到底是什么原理?将m分成固定长度(如128位),依次进行hash运算,然后用不同的方法迭代即可(如前一块的hash值与后一块的hash值进行异或)。如果不够128位怎么办?用0补全或者用1补全随意,算法中约定好就可以了。 原问题回答完毕。但是既然要说hash算法,不妨说的更透彻些。 =================分割线========== 由于用途的不同,hash在数据结构中的含义和密码学中的含义并不相同,所以在这两种不同的领域里,算法的设计侧重点也不同。 预备小知识: 抗碰撞能力:对于任意两个不同的数据块

到底什么是hash呢?hash碰撞?为什么HashMap的初始容量是16?

元气小坏坏 提交于 2019-12-03 19:37:00
一 ,到底什么是hash呢? 作者:知乎用户 链接:https://www.zhihu.com/question/26762707/answer/40119521 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 hash(散列、杂凑)函数,是将任意长度的数据映射到有限长度的域上。直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹)。 也就是说,无论数据块m有多大,其输出值h为固定长度。到底是什么原理?将m分成固定长度(如128位),依次进行hash运算,然后用不同的方法迭代即可(如前一块的hash值与后一块的hash值进行异或)。如果不够128位怎么办?用0补全或者用1补全随意,算法中约定好就可以了。 原问题回答完毕。但是既然要说hash算法,不妨说的更透彻些。 =================分割线========== 由于用途的不同,hash在数据结构中的含义和密码学中的含义并不相同,所以在这两种不同的领域里,算法的设计侧重点也不同。 预备小知识: 抗碰撞能力:对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。 抗篡改能力:对于一个数据块,哪怕只改动其一个比特位,其hash值的改动也会非常大。 在用到hash进行管理的数据结构中

Hash函数浅谈

佐手、 提交于 2019-12-03 13:32:12
Hash函数是指把一个大范围映射到一个小范围。把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存。 除此以外,Hash函数往往应用于查找上。所以,在考虑使用Hash函数之前,需要明白它的几个限制: 1. Hash的主要原理就是把大范围映射到小范围;所以,你输入的实际值的个数必须和小范围相当或者比它更小。不然冲突就会很多。 2. 由于Hash逼近单向函数;所以,你可以用它来对数据进行加密。 3. 不同的应用对Hash函数有着不同的要求;比如,用于加密的Hash函数主要考虑它和单项函数的差距,而用于查找的Hash函数主要考虑它映射到小范围的冲突率。 Hash函数应用的主要对象是数组(比如,字符串),而其目标一般是一个int类型。以下我们都按照这种方式来说明。 一般的说,Hash函数可以划分为如下几类: 1. 加法Hash 2. 位运算Hash 3. 乘法Hash 4. 除法Hash 5. 查表Hash 6. 混合Hash 7.数组Hash 下面详细的介绍以上各种方式在实际中的运用。 一、几种经典的Hash函数实现 1、加法Hash 所谓的加法Hash就是把输入元素一个一个的加起来构成最后的结果。标准的加法Hash的构造如下: 1 static int additiveHash(String key, int prime) 2 { 3 int hash, i; 4 for

go map数据结构和源码详解

白昼怎懂夜的黑 提交于 2019-12-03 10:26:23
目录 1. 前言 2. go map的数据结构 2.1 核心结体体 2.2 数据结构图 3. go map的常用操作 3.1 创建 3.2 插入或更新 3.3 删除 3.4 查找 3.5 range迭代 3.5.1 初始化迭代器mapiterinit() 3.5.2 迭代过程mapiternext() 4. go map的扩容缩容 4.1 扩容缩容的基本原理 4.2 为什么叫“伪缩容”?如何实现“真缩容”? 5 Q&A关键知识点 5.1 基本原理 5.2 时间复杂度和空间复杂度分析 1. 前言 本文以go1.12.5版本分析,map相关的源码在runtime包的map开头的几个文件中,主要为map.go。 go的map底层实现方式是hash表(C++的map是红黑树实现,而C++ 11新增的unordered_map则与go的map类似,都是hash实现)。go map的数据被置入一个由桶组成的有序数组中,每个桶最多可以存放8个key/value对。key的hash值(32位)的低阶位用于在该数组中定位到桶,而高8位则用于在桶中区分key/value对。 go map的hash表中的基本单位是桶,每个桶最多存8个键值对,超了,则会链接到额外的溢出桶。所以go map是基本数据结构是hash数组+桶内的key-value数组+溢出的桶链表 当hash表超过阈值需要扩容增长时

10、密码扩展

白昼怎懂夜的黑 提交于 2019-12-03 09:37:39
1、使用Werkzeug实现密码散列 在User模型中加入密码散列 app/models.py 计算密码散列值的函数通过名为password的只写属性实现,设定这个属性的值时,赋值方法会调用Werkzeug提供的generate_password_hash()函数,并把得到的结果赋值给password_hash字段。 如果试图读取password属性的值,则会返回错误,原因很明显,因为生成散列值后就无法还原成原来的密码了 from . import db from werkzeug.security import generate_password_hash, check_password_hash #定义数据库模型 class Role(db.Model): __tablename__ = 'roles' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) users = db.relationship('User', backref='role') def __repr__(self): return '<Role %r>' %self.name class User(db.Model): __tablename__ = 'users' id = db

go map数据结构和源码详解

别说谁变了你拦得住时间么 提交于 2019-12-03 07:58:52
目录 1. 前言 2. go map的数据结构 2.1 核心结体体 2.2 数据结构图 3. go map的常用操作 3.1 创建 3.2 插入或更新 3.3 删除 3.4 查找 3.5 range迭代 3.5.1 初始化迭代器mapiterinit() 3.5.2 迭代过程mapiternext() 4. go map的扩容缩容 4.1 扩容缩容的基本原理 4.2 为什么叫“伪缩容”?如何实现“真缩容”? 5 Q&A关键知识点 5.1 基本原理 5.2 时间复杂度和空间复杂度分析 1. 前言 本文以go1.12.5版本分析,map相关的源码在runtime包的map开头的几个文件中,主要为map.go。 go的map底层实现方式是hash表(C++的map是红黑树实现,而C++ 11新增的unordered_map则与go的map类似,都是hash实现)。go map的数据被置入一个由桶组成的有序数组中,每个桶最多可以存放8个key/value对。key的hash值(32位)的低阶位用于在该数组中定位到桶,而高8位则用于在桶中区分key/value对。 go map的hash表中的基本单位是桶,每个桶最多存8个键值对,超了,则会链接到额外的溢出桶。所以go map是基本数据结构是hash数组+桶内的key-value数组+溢出的桶链表 当hash表超过阈值需要扩容增长时

HashMap源码分析

核能气质少年 提交于 2019-12-03 07:40:32
一、前言   在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化,其中最重要的一个优化就是桶中的元素不再唯一按照链表组合,也可以使用红黑树进行存储,总之,目标只有一个,那就是在安全和功能性完备的情况下让其速度更快,提升性能。好~下面就开始分析源码。 二、HashMap数据结构      说明:上图很形象的展示了HashMap的数据结构(数组+链表+红黑树),桶中的结构可能是链表,也可能是红黑树,红黑树的引入是为了提高效率。所以可见,在分析源码的时候我们不知不觉就温习了数据结构的知识点,一举两得。 三、HashMap源码分析   3 .1 类的继承关系  public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable   可以看到HashMap继承自父类(AbstractMap),实现了Map、Cloneable、Serializable接口。其中,Map接口定义了一组通用的操作;Cloneable接口则表示可以进行拷贝,在HashMap中,实现的是浅层次拷贝,即对拷贝对象的改变会影响被拷贝的对象;Serializable接口表示HashMap实现了序列化

最基础的数据结构-左轻侯

一曲冷凌霜 提交于 2019-12-03 06:07:53
作者:左轻侯 创建时间:2007-03-04 22:29:06 最后修改时间:2008-01-18 22:07:52 本文发表于《程序员》2007年第3期      最基础的数据结构   左轻侯   2007.2.3      引言       任何一个受过专业训练的程序员,对“数据结构”这门课程中涉及到的各种数据结构都不会感到陌生。但是,在实际的编程工作中,大部分的数据结构都不会用到,而且也许永远都不会用到。造成这种现象的原因有二:一是根据80/20法则,常用的数据结构只会占到少部分;二是计算机语言往往已经对常用的数据结构进行了良好的封装,程序员不需要关心内部的实现。    虽然如此,深入地理解基本数据结构的概念和实现细节,仍然是每一个程序员的任务。这不仅是因为,掌握这些知识,将有利于更加正确和灵活地应用它们,而且也是因为,对于语言背后的实现细节的求知欲,是一个优秀的程序员的素质。    本文将讨论实际编程最经常使用的三种数据结构:字符串、数组和Hash表,比较它们在不同语言中的实现思路,并涉及它们的使用技巧。      字符串    严格地说,字符串(string)甚至不能算作一种单独的数据结构,至少在C语言中,它仅仅是某种特定类型的数组而已。但是,字符串在实际使用中是如此重要,在不同语言中的实现又差异颇大,因此,它值得被作为一种抽象数据类型单独进行讨论

C++ unordered_set 使用struct或者class

帅比萌擦擦* 提交于 2019-12-03 02:16:59
本文介绍如何将unordered_set应用于strcut或者class 先看看其声明 template < class Key, // unordered_set::key_type/value_type class Hash = hash<Key>, // unordered_set::hasher class Pred = equal_to<Key>, // unordered_set::key_equal class Alloc = allocator<Key> // unordered_set::allocator_type > class unordered_set ; 对于没有特殊需求的non-POD的int、string等类型来说,实用默认的模板参数即可,当我们要使用struct或者class等数据结构作为输入时,则需要一些特定的步骤。 假设我们需要为下面的结构体设置unordered_set容器: struct record{ string num; string file; mutable int count; record( string n, string f):num(n),file(f),count( 1 ){} }; 1.指定hasher 将作为模板第二个参数 struct record_hash{ size_t operator ()( const

面试官: 你了解前端路由吗?

泄露秘密 提交于 2019-12-03 01:53:32
本文转载于: 猿2048 网站➼ https://www.mk2048.com/blog/blog.php?id=hhi0a1bhbb 面试官系列(3): 前端路由的实现 往期 面试官系列(1): 如何实现深克隆 面试官系列(2): Event Bus的实现 文章目录 基于hash的前端路由实现 基于hash的前端路由升级 基于H5 History的前端路由实现 前言 前端路由 是现代SPA应用必备的功能,每个现代前端框架都有对应的实现,例如vue-router、react-router。 我们不想探究vue-router或者react-router们的实现,因为不管是哪种路由无外乎用兼容性更好的hash实现或者是H5 History实现,与框架几个只需要做相应的封装即可。 提前声明: 我们没有对传入的参数进行及时判断而规避错误,也没有考虑兼容性问题,仅仅对核心方法进行了实现. 1.hash路由 hash路由一个明显的标志是带有 # ,我们主要是通过监听url中的hash变化来进行路由跳转。 hash的优势就是兼容性更好,在老版IE中都有运行,问题在于url中一直存在 # 不够美观,而且hash路由更像是Hack而非标准,相信随着发展更加标准化的 History API 会逐步蚕食掉hash路由的市场。 1.1 初始化class 我们用 Class 关键字初始化一个路由.