hash函数

这26个为什么,让初学者理解Python更简单!

柔情痞子 提交于 2020-01-07 04:13:50
为什么Python使用缩进来分组语句? 为什么简单的算术运算得到奇怪的结果? 为什么浮点计算不准确? 为什么Python字符串是不可变的? 为什么必须在方法定义和调用中显式使用“self”? 为什么不能在表达式中赋值? 为什么Python对某些功能(例如list.index())使用方法来实现,而其他功能(例如len(List))使用函数实现? 为什么 join()是一个字符串方法而不是列表或元组方法? 异常有多快? 为什么Python中没有switch或case语句? 难道不能在解释器中模拟线程,而非得依赖特定于操作系统的线程实现吗? 为什么lambda表达式不能包含语句? 可以将Python编译为机器代码,C或其他语言吗? Python如何管理内存? 为什么CPython不使用更传统的垃圾回收方案? CPython退出时为什么不释放所有内存? 为什么有单独的元组和列表数据类型? 列表是如何在CPython中实现的? 字典是如何在CPython中实现的? 为什么字典key必须是不可变的? 为什么 list.sort() 没有返回排序列表? 如何在Python中指定和实施接口规范? 为什么没有goto? 为什么原始字符串(r-strings)不能以反斜杠结尾? 为什么Python没有属性赋值的“with”语句? 为什么 if/while/def/class语句需要冒号?

HashMap源码分析

帅比萌擦擦* 提交于 2020-01-07 00:19:29
HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。 JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树),以减少搜索时间,具体可以参考 treeifyBin 方法。 底层数据结构分析 JDK1.8之前 JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。 所谓扰动函数指的就是 HashMap 的 hash 方法。使用 hash 方法也就是扰动函数是为了防止一些实现比较差的 hashCode() 方法 换句话说使用扰动函数之后可以减少碰撞。 JDK 1.8

聊聊一致性hash算法的原理

纵饮孤独 提交于 2020-01-06 20:03:49
https://mp.weixin.qq.com/s/BnErT5xrPpq76A4qUEyQCw 工程师经常使用服务器的集群来设计和实现数据缓存,他们常见的策略是: 1:不管是添加,删除和查询数据,都是先将数据的id通过hash函数生成一个hash值,记为key。 2:如果有N台机器,则会计算key%N的值,这个值就是所属机器的编号,无论是添加,删除和查询数据,都是在这台机器上操作。 请分析上面的策略存在的问题,并提出解决的方案。 2 解答 1:首先来想下在什么情况下会产生问题。一般情况下,在不增加机器的情况下,产生的hash值相同,那么就会在某一台机器上操作,不会产生什么问题,但是如果增加或者删除了机器,即N变化的时候,代价就会比较高,所有的数据都需要根据id重新计算一次hash值,并通过hash值对新的机器进行重新取模操作,然后对数据进行大规模的迁移。 2:那么为了解决这些问题,我们就引入了一致性hash算法,这是一种很好的数据缓存解决方案。 假设通过id生成的hash值是0到(2^32)-1 的范围,那么我们可以想象成一个闭合的圆,一个数据id计算出的hash值就是对应圆中的某一个位置,如图所示 当采用一致性哈希算法,把分布式集群中新的机器加入。其原理是通过使用与对象存储一样的Hash算法将机器也映射到圈中

数据库中间件分片算法之stringhash

牧云@^-^@ 提交于 2020-01-03 17:29:08
前言 又是一个夜黑风高的晚上,带上无线耳机听一曲。突然很感慨一句话: 生活就像心电图,一帆风顺就证明你挂了。 就如同我们干运维的,觉得很简单的事情,有时候能干出 无限可能 。还是言归正传吧,这一次我们来说说stringhash分区算法。 1.hash分区算法 2.stringhash分区算法 3.enum分区算法 4.numberrange分区算法 5.patternrange分区算法 6.date分区算法 7.jumpstringhash算法 StringHash分区算法的配置 < tableRule name = " rule_hashString " > < rule > < columns > name </ columns > < algorithm > func_hashString </ algorithm > </ rule > </ tableRule > < function name = " func_hashString " class = " StringHash " > < property name = " partitionCount " > 3,2 </ property > < property name = " partitionLength " > 3,4 </ property > < property name = " hashSlice

聊一聊字节跳动的面试

烂漫一生 提交于 2020-01-01 20:26:37
作者:草木青川 链接:https://zhuanlan.zhihu.com/p/82871762 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 lc里最长上升子序列的变形题。实现输入英文单词联想的功能二面:矩阵旋转,要求空间复杂度O(1)无序的数组的中位数。要求时间复杂度尽可能的小计算机网络tcp 怎么保证数据包有序1. 主机每次发送数据时,TCP就给每个数据包分配一个序列号并且在一个特定的时间内等待接收主机对分配的这个序列号进行确认,2. 如果发送主机在一个特定时间内没有收到接收主机的确认,则发送主机会重传此数据包。3. 接收主机利用序列号对接收的数据进行确认,以便检测对方发送的数据是否有丢失或者乱序等,4. 接收主机一旦收到已经顺序化的数据,它就将这些数据按正确的顺序重组成数据流并传递到高层进行处理。tcp 和 udp 的异同TCP是面向流的可靠数据传输连接UDP是面向数据包的不可靠无连接tcp 怎么保证可靠性差错检验机制,反馈机制,重传机制,引入序号,滑动窗口协议,选择重传tcp 中 拥塞避免 和 流量控制 机制拥塞避免和流量控制这两种机制很像,但是流量控制是由接收方的接受能力也就是接收窗口所决定的,如果接收窗口够大,以动态调整发送窗口的大小调整发送速度拥塞避免主要由网络情况所限制,网络情况良好,则加大发送速率,网络状态差(冗余ACK和丢包

HashMap、lru、散列表

北战南征 提交于 2020-01-01 10:21:05
HashMap HashMap的数据结构:HashMap实际上是一个数组和链表(“链表散列”)的数据结构。底层就是一个数组结构,数组中的每一项又是一个链表。 hashCode是一个对象的标识,Java中对象的hashCode是一个int类型值。通过hashCode来算出指定数组的索引可以快速定位到要找的对象在数组中的位置,之后再遍历链表找到对应值,理想情况下时间复杂度为O(1),并且不同对象可以拥有相同的hashCode(hash碰撞)。发生碰撞后会把相同hashcode的对象放到同一个链表里,但是在数组大小不变的情况下,存放键值对越多,查找的时间效率也会降低 扩容可以解决该问题,而负载因子决定了什么时候扩容,负载因子是已存键值对的数量和总的数组长度的比值。默认情况下负载因子为0.75,我们可在初始化HashMap的时候自己修改。阀值 = 当前数组长度✖负载因子 hashmap中默认负载因子为0.75,长度默认是16,默认情况下第一次扩容判断阀值是16 ✖ 0.75 = 12;所以第一次存键值对的时候,在存到第13个键值对时就需要扩容了,变成16X2=32。 put流程 对key hash,二次hash,hash扰乱函数,减少hash碰撞 int hash(Object key) { int h = key.hashCode(); return (h ^ (h >>> 16)) &

深入理解HashMap

淺唱寂寞╮ 提交于 2019-12-30 12:11:10
1、为什么用HashMap? HashMap是一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射 HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改 HashMap是非synchronized,所以HashMap很快 HashMap可以接受null键和值,而Hashtable则不能(原因就是equlas()方法需要对象,因为HashMap是后出的API经过处理才可以) 2、HashMap的工作原理是什么? HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,计算并返回的hashCode是用于找到Map数组的bucket位置来储存Node 对象。这里关键点在于指出,HashMap是在bucket中储存键对象和值对象,作为Map.Node 。   以下是HashMap初始化 ,简单模拟数据结构 Node[] table=new Node[16] 散列桶初始化,table class Node { hash;//hash值 key;//键  value;//值  node next;//用于指向链表的下一层(产生冲突,用拉链法) }

redis模块

人走茶凉 提交于 2019-12-30 04:25:31
http://www.cnblogs.com/melonjiang/p/5342505.html http://www.django-china.cn/topic/1054/ 1、连接方式   redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类 #!/usr/bin/env python # -*- coding:utf-8 -*- import redis r = redis.Redis(host='192.168.0.110', port=6379,db=0) r.set('name', 'zhangsan') #添加 print (r.get('name')) #获取 2、连接池    redis- py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数 Redis,这样就可以实现多个Redis实例共享一个连接池。 #!/usr/bin/env python # -*- coding:utf-8 -*- import redis pool = redis.ConnectionPool

day91-redis

試著忘記壹切 提交于 2019-12-30 04:23:19
Redis数据库 简介 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步 python操作Redis之普通连接 redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py import redis r = redis.Redis(host='127.0.0.1', port=6379) r.set('foo', 'Bar') print(r.get('foo')) python操作Redis之连接池 redis-py使用connection

redis之列表字典操作

泪湿孤枕 提交于 2019-12-30 04:21:01
Hash操作 hset(name,key,value) name对应的hash中设置一个键值对(不存在则创建,否则修改) 参数:name,redis中的name key,name对应的hash中的key value,name对应的hash中的value 注:hsetnx(name,key,value) ,当name对应的hash中不存在当前key时则创建 hmset(name,mapping) 在name对应的hash中批量设置键值对 参数:mapping,字典,如:{'k1':'v1','k2':'v2'} hget(name,key) 在name对应的hash中获取根据key获取value hmget(name,keys,*args) 在name对应的hash中获取多个key的值 参数:keys要获取key集合:['k1','k2','k3'] *args,要获取的key,如:k1,k2,k3 hgetall(name) 获取name对应hash的所有键值 hlen(name) 获取name对应的hash中键值对的个数 hkeys(name) 获取name对应的hash中多有的key的值 hvals(name) 获取name对应的hash中所有的value的值 hexists(name,key) 检查name对应的hash是否存在当前传入的key 返回值为数字(存在的个数)