哈希

各种字符串Hash函数比较

淺唱寂寞╮ 提交于 2019-11-29 10:44:30
转载自: http://www.byvoid.com/blog/string-hash-compare/ 常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞。 常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等。对于以上几种哈希函数,我对其进行了一个小小的评测。 Hash函数 数据1 数据2 数据3 数据4 数据1得分 数据2得分 数据3得分 数据4得分 平均分 BKDRHash 2 0 4774 481 96.55 100 90.95 82.05 92.64 APHash 2 3 4754 493 96.55 88.46 100 51.28 86.28 DJBHash 2 2 4975 474 96.55 92.31 0 100 83.43 JSHash 1 4 4761 506 100 84.62 96.83 17.95 81.94 RSHash 1 0 4861 505 100 100 51.58 20.51 75.96 SDBMHash 3 2 4849 504 93.1 92.31 57.01 23.08 72

编码、摘要、加密

限于喜欢 提交于 2019-11-29 09:15:29
编码、摘要、加密的区别: 相同点:   三种方式都是通过某种公开的算法将原始信息进行编码 /加密 不同点:   编码:将数据转化成某种固定的格式的编码信息,方便不同系统间的传输,通过解码编码信息可以得到原始信息   摘要(哈希):验证信息的唯一性,不能通过哈希值还原原始信息   加密:加密传输信息,保证信息的安全性,通过密钥和密文可以还原原始信息 编码、散列、哈希、加密的区别:经常看到有人混淆这几个概念,把 md5、sha256 甚至还有 Base64 当作加密算法,弄不清楚摘要、编码、加密的区别,下面就这几个概念结合几个例子来区分以下。 编码: 编码本质上是信息形式的转化。编码的目的不是为了加密信息,是将消息转化成统一的格式,方便在不同系统之中传输。例如最常见的ASCII字符编码。由于网络上只能传输二进制数据,任何数据如果想要经由网络传输,就必须先转化成二进制,ASCII 提供了一个将A、B、C等字母转化为二进制的规则。 信息—>编码—>二进制—>解码—>信息 通过解码可以还原原始信息 例子:ASCII, Unicode, URL Encoding, Base64等 摘要(哈希): 摘要的目的是为了校验信息的完整性,保证信息在传输过程中不被篡改。例如你在网络上需要下载一个非官方论坛软件,但又担心软件被第三方篡改,可以将该软件的md5值和官方下载的md5值进行对比,如果一致

[MySQL-笔记]创建高性能索引

匆匆过客 提交于 2019-11-29 08:28:46
  索引,MySQL中也叫“键”,是存储引擎中用于快速找到记录的一种数据结构,具体的工作方式就像书本中的索引一样,但是具体的实现方式会有差别。 一.索引分类 B-Tree索引:    优点: MyISAM中,索引根据数据的 物理位置 引用被索引的行,InnoDB中根据 主键 引用被索引的行。 B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,而是从索引的根节点开始进行搜索。 B-Tree对索引列是顺序组织存储的,所以很适合查找 范围 数据。 一般来说,B-Tree可以按照某种方式查找到值,那么也可以用这种方式排序    限制: 如果不是按照索引的最左列开始查到,则无法使用索引 不能跳过索引中的列 如果查询中有某个列的范围查询,则其右边所有的列都无法使用索引优化查找。 哈希索引:   哈希索引基于哈希表实现,只有精确匹配的索引所有列的查询才有效   优点: 非常快   限制: 哈希索引只包含哈希值和行指针,而不存储字段值,所以 不能使用索引中的值来避免读取行 。 哈希索引不是按照索引值顺序存储的,所以 不能用于排序 。 哈希索引不支持部分索引列匹配查找。 哈希索引只支持等值比较查询。 哈希冲突很多的话,一些索引维护操作的代价会很高。 二.索引的优点 最常见的是B-Tree索引,按照顺序存储数据,所以可以用来做ORDER BY和GROUP

Java中HashMap和TreeMap的区别

会有一股神秘感。 提交于 2019-11-29 06:20:58
什么是Map集合在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对。 HashMap 非线程安全 TreeMap 非线程安全 1、多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized.如ArrayList和Vector,HashMap和Hashtable   (后者每个方法前都有synchronized关键字)。如果你在interator一个List对象时,其它线程remove一个element,问题就出现了。 2、每个线程都有自己的字段,而不会在多个线程之间共享。它主要体现在java.lang.ThreadLocal类,而没有Java关键字支持,如像static、transient那样。 1.AbstractMap抽象类和SortedMap接口   AbstractMap抽象类:(HashMap继承AbstractMap)覆盖了equals()和hashCode()方法以确保两个相 等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的 总和,其中每个元素是Map.Entry接口的一个实现。因此

字典中可以进行的操作、哈希函数

允我心安 提交于 2019-11-29 05:02:48
不可变类型 ,内存中的数据不允许被修改: 数字类型 int , bool , float , complex , long(2.x) 字符串 str 元组 tuple 可变类型 ,内存中的数据可以被修改: 列表 list 字典 dict a = {} # key = "name" value = "小明" a["name"] = "小明" print(a) # key = 1 value = "nihao" a[1] = "nihao" print(a) # 元祖也可以作为key a[(1,)] = "元祖" print(a) # 列表不能作为key a[[1,2,3]] = "列表" # 字典也不能作为key a[{"name" :"xiaoming"}] 哈希函数 Python 中内置有一个名字叫做 hash(o) 的函数 接收一个 不可变类型 的数据作为 参数 返回 结果是一个 整数 哈希 是一种 算法 ,其作用就是提取数据的 特征码(指纹) 相同的内容 得到 相同的结果 不同的内容 得到 不同的结果 在 Python 中,设置字典的 键值对 时,会首先对 key 进行 hash 已决定如何在内存中保存字典的数据,以方便 后续 对字典的操作: 增、删、改、查 键值对的 key 必须是不可变类型数据 键值对的 value 可以是任意类型的数据 来源: https://blog

面试连环炮系列(二):你们的项目Redis做了集群部署吗

怎甘沉沦 提交于 2019-11-29 04:44:50
你们的项目Redis做了集群部署吗? 我们有大量数据需要缓存,而单实例的容量毕竟是有限的,于是做了Redis集群部署。 采取的方案是什么,Codis还是Redis Cluster,为什么要选择这个方案? 我们采用的官方Redis Cluster方案。Codis是一整套缓存解决方案,采取的代理模式实现了高可用、数据分片、监控、动态扩态等功能,但是部署太复杂了。Cluster要简单很多,而且也基本满足目前的需要。 Redis Cluster有什么缺点吗,或者说不适合什么场景? 这种模式将存储和元数据管理放一起的,出现问题不好排查,如果是大规模集群或者多地域情况下不适合, 可能会有较高的网络通讯成本以及脑裂等问题。 Redis Cluster的集群分片原理是什么? Redis集群没有使用一致性hash, 而是引入了哈希槽的概念。Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:节点 A 包含 0 到 5500号哈希槽;节点 B 包含5501 到 11000 号哈希槽;节点 C 包含11001 到 16384号哈希槽。 为什么哈希槽偏偏是16384个? 在redis节点发送心跳包时需要把所有的槽放到这个心跳包里,以便让节点知道当前集群信息,16384=2^14

perl返回哈希和的键和值

[亡魂溺海] 提交于 2019-11-29 03:14:49
#!/usr/bin/perl #!/usr/bin/perl %data = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com'); @names = keys %data;#该函数返回所有哈希的所有key的数组 #注意是数组 print "$names[0]\n"; print "$names[1]\n"; print "$names[2]\n"; %data2 = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com'); @urls = values %data2;#该函数返回所有哈希的所有value的数组 #注意是数组 print "$urls[0]\n"; print "$urls[1]\n"; print "$urls[2]\n"; 来源: https://www.cnblogs.com/shunguo/p/11441667.html

redis的对象

二次信任 提交于 2019-11-29 02:17:52
    简介:redis并没有直接使用前面所提到的基本数据结构,而是基于基本的数据结构构造了一个对象系统。这个系统包含了字符串对象,列表对象,哈希对象,集合对象,有序集合对象五种类型的对象。每种对象都用到了至少一种我们前面所说的数据结构。 对象的类型和编码   redis使用对象来表示数据库中的键和值,每次当我们在redis数据库中创建一个键值对的时候,我们至少会创建两个对象。   redis中的每个对象都由一个redisObject结构表示:      1.对象类型    对象有以下几种类型:       对于redis数据库来说,键总是一个字符串对象,值可能是上述五种对象的其中一种。 地方   Type命令在面对不同类型对象时所产生的输出如下:      2.对象编码   encodeing属性决定了ptr指针指向的底层数据结构的数据结构类型也称为对象编码。      每种类型的对象至少对应了两种不同的编码,下面列出每种对象可以使用的编码。   使用object encoding命令可以查看一个数据库的值对象的编码      下表展示了不同编码对象对应的object encoding命令的输出   通过encoding属性去设置对象的编码方式,极大地提高了redis存储对象的底层数据结构的灵活性,因为不同的数据结构适用的存储场景不一样,比如列表对象包含的元素比较少的时候

【转载】【分布式】一致性哈希算法

荒凉一梦 提交于 2019-11-28 20:39:26
本文转载自: https://www.cnblogs.com/lpfuture/p/5796398.html 如有侵权,请告知下线,多谢!! 0. 目的 分布式系统中节点根据哈希取值进行保存数据,当有节点新增或者节点下线,普通哈希算法会需要所有数据的哈希分布重新计算。而一致性哈希算法只需要重新计算下线的节点的数据即可。关键在于数据在环上,顺时针向最靠近的节点分布。 1. 一致性Hash性质 考虑到分布式系统每个节点都有可能失效,并且新的节点很可能动态的增加进来,如何保证当系统的节点数目发生变化时仍然能够对外提供良好的服务,这是值得考虑的,尤其实在设计分布式缓存系统时,如果某台服务器失效,对于整个系统来说如果不采用合适的算法来保证一致性,那么缓存于系统中的所有数据都可能会失效(即由于系统节点数目变少,客户端在请求某一对象时需要重新计算其hash值(通常与系统中的节点数目有关),由于hash值已经改变,所以很可能找不到保存该对象的服务器节点),因此一致性hash就显得至关重要,良好的分布式cahce系统中的一致性hash算法应该满足以下几个方面: 平衡性(Balance) 平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。 单调性(Monotonicity) 单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中

五句话了解区块链,扫盲系列

会有一股神秘感。 提交于 2019-11-28 19:28:05
1.区块链解决了啥问题 一个东西有价值,一定是解决了一个社会上的痛点。我们说人工智能是未来的趋势,因为它主要解决的是生产力的升级问题,工业革命代替人的简单体力劳动,人工智能代替的是例如思考之类的复杂劳动。区块链解决的是生产关系的问题,也就是信任的问题,想一下为什么淘宝需要有支付宝,因为如果没拿到货而直接付钱,卖家不发货怎么办?需要担保机制,这就是买卖间彼此不信任的问题。 2.区块链的核心技术理论是啥? 一句话,去中心化。我们聊微信,用支付宝,所有的数据都会上传到阿里或者腾讯的服务器,而不是存在本地。区块链是将所有数据都在每一个节点存储,有啥好处呢?比如用微信,数据都是在腾讯的服务器上,它想给你看什么你才能看到什么。如果全网的数据都在每个人的电脑上,是不是你的另一半跟哪个女的撩骚你一下就知道了。 3.区块链最大特点是啥? 每个节点的数据一致性,区块链是一个开放的数据库,任何服务器都可以加入区块链,并成为其中的一个节点,每个节点都保存着区块链的全部数据,而且是相同的,只有这个前提成立,前面介绍的两点才成立。那区块链是怎么做到 每个节点数据一致的呢?每个区块就是一个哈希值,哈希就是一串字母加数字,可以表示任何的事情。每个区块链都需要记录上一个区块链、生成时间、以及本区块链的一些信息。一旦一个区块链被修改了,那么它自己的哈希值就变了,因为下一个区块需要记录上个区块的哈希值