2020-08-24 21:15发布
zookeeper是分布式服务架构,主要用来解决分布式应用中经常遇到的一些数据管理问题,比如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
zookeeper上节点最常用的5种操作权限:
Create、Read、Write、Delete、Admin也就是增、删、改、查、管理权限,简写crwda
(这五种权限中,delete是指对子节点删除权限,其他四种权限指本身节点权限)
身份验证有4中方式:
world:有个单一的ID,anyone,表示任何人。
auth:不使用任何ID,表示任何通过验证的用户(是通过ZK验证的用户?连接到此ZK服务器的用户?)。
digest:使用 用户名:密码字符串生成MD5哈希值作为ACL标识符ID。权限的验证通过直接发送用户名密码字符串的方式完成,
ip:使用客户端主机ip地址作为一个ACL标识符,ACL表达式是以 addr/bits这种格式表示的。ZK服务器会将addr的前bits位与客户端地址的前bits位来进行匹配验证权限。
看到了授权需要的模式是secheme????perm形式,下面就说说secheme
world表示所有。创建节点的默认权限,有唯一的id是anyone授权的时候模式为world:anyone:rwcda表示所有人都有对这个节点的rwcda权限。这里用的是id,而不是expression。
auth不需要id。不过这里应该用expression来表示。
digest使用用户名:密码编码成md5的方式作为访问权限列表id。但是这里id不作为授权语句的一部分,这里也是用expression方式。用户名:密码先进行shal编码后再用base64编码。这个比较恶心。
host使用用户主机作为访问空着列表的id。但是这里需要注意的是表达式用的主句的后缀即可。举个栗子:如果表达式设置为corp.com 可以匹配 host1.corp.com 和host2.corp.com的主机名,但是host1.zookeeper.com则不能匹配。
ip:跟主机名类似。这里使用客户端的ip地址作为权限访问列表的id。表达式可以用addr/bits这种方式设置ip白名单。
方法一、auth设置权限
设置这个权限之前首先需要
addauth digest zookeeper:zookeeper
然后再设置auth
setAcl /test auth:zookeeper:zookeeper:crwda
检查权限
getAcl /test
可以看到权限已经设置成功了。
get /test
方法二、digest设置权限 (这个里面有个大坑)
可以看出比较明显的:
设置之前不需要通过addauth添加对应的授权认证,而是直接授权便可。
命令行设置了什么,然后在获取对应的权限的时候就会把对应的字符串显式记录下来,而不会进行任何编码,如上面的zookeeper:zookeeper。这种方式就需要自己去编码了。
这也是个比较坑爹的事情,设置密码之前需要把密码先自己进行sha1编码然后吧结果进行base64编码。如果编码的方式错误你将永远失去这个节点的访问权。不编码就访问不了
使用sha1编码和base64编码之后设置digest方式保存起来
之后就可以使用addauth的方式访问啦
创建节点数据时:
读取Zookeeper数据时:
通常使用dubbo一般有四种方式,xml配置、API调用、properties加载、注解配置。使用zookeeper作为注册中心主要配置如下:
xml schema扩展
properties配置
API代码设置
注解配置
最近又把dubbo拾起来啦,以前用过dubbo,后来12年阿里巴巴不维护啦,后来随着springcloud的不断崛起,使用dubbo的人越来越少,但是在国内还是有好多dubbo的热爱着,也是因为这样,在2017年的时候阿里将dubbo奉献给Apache社区,后面估计会越来越好。
这个无论是之前阿里维护还是现在放到Apache社区,直到目前为止,dubbo都没做好这块,使用zookeeper加权限连接,其实挺简单的,下面大致讲以下怎么做。
这里做之前先说一下实现dubbo连接加权限的zookeeper有两种方式,这个取决于dubbo连接zookeeper是通过两种客户端连接的,分别是zkclient和curator,而且dubbo提前预留量注册中心变量设置用户名和密码,这里使用的zookeeper加权方式是digest方式,使用用户名和密码方式对zookeeper节点加权限。
这里需要注意的是,自从dubbo转到Apache下面之后,源码改动不少,其中在dubbo2.6.0以后版本,dubbo将默认使用zkclient访问zookeeper改成了默认使用curator客户端访问。而且在2.5.4版本之后将com.github.sgroschupf 下面的zkclient 0.1版本改成了com.101tec 下面的zkclient 0.2版本啦。
替换zkclient jar包
这里无论是新版本还是旧版本,都需要将zkclient包替换成com.101tec的0.5以上版本,因为只有0.5以上的版本才支持ACL加权控制。(本人建议使用0.8以上的版本)
如果你是2.5.4以前的版本(包括2.5.4版本,就是12年之后17年之前发布的最新版本)需要将
替换成
(这个之前版本比较麻烦,需要到源码中将所有的pom都需要修改)
如果你是使用2.5.4以后的版本比较简单,只需要将dubbo-parent中的
0.2
改成
0.8
dubbo使用zkclient客户端源码解析
这里简单的介绍也一下dubbo连接Zookeeper的实现原理,首先服务的提供者和消费者在RegistryProtocol利用注册中心暴露(export)和引用(refer)服务的时候会根据配置利用Dubbo的SPI机制获取具体注册中心注册器
这里的RegistryFactory是ZookeeperRegistryFactory看如下工厂代码
在这里创建zookeepr注册器ZookeeperRegistry。
ZookeeperTransporter是操作zookeepr的客户端的工厂类,用来创建zookeeper客户端,这里客户端并不是zookeeper源代码的自带的,而是采用第三方工具包,主要来简化对zookeeper的操作,例如用zookeeper做注册中心需要对zookeeper节点添加watcher做反向推送,但是每次回调后节点的watcher都会被删除,这些客户会自动维护了这些watcher,在自动添加到节点上去。
dubbo源码改造适配zookeeper添加ACL权限
这里又要分版本对待,对dubbo添加zookeeper权限适应于2.2.0-2.5.6版本之间dubbo使用者,2.5.6之后版本添加了ZkClientWrapper类,对zkclient又做成守护线程形式,需要进一步改造,后面也会专门提高2.5.6之后怎么改造的。
在使用zkClient连接Zookeeper中最重要的一个类是ZkclientZookeeperClient,Zookeeper的连接、节点创建和节点访问都在这个类中,我们需要重点改造的类。
ZkclientZookeeperClient在构造函数中创建连接Zookeeper,在连接的时候使用用户名密码连接:
将ZkclientZookeeperClient中的“createPersistent(Stringpath)”和“createEphemeral(String path)”创建节点设置权限:
到目前为止,源码就改动这么多,连接Zookeeper的用户名和密码通过dubbo配置注册中心的时候配置,通过spring加载代URL中。然后下面就说说具体怎么配置怎么用。
改造后的dubbo连接Zookeeper配置
从 2.2.0 版本开始缺省为 zkclient 实现,以提升 zookeeper 客户端的健状性,配置:
或
dubbo.registry.client=zkclient
dubbo.registry.username=admin
dubbo.registry.password=admin
zookeeper://10.20.153.10:2181?client=zkclient&username=admin&password=admin
到此直接启动即可,dubbo就可自动对注册dubbo的group节点添加ACL权限。
添加handleSessionEstablishmentError监控方法
重写ZkClientWrapper构造方法
针对client.start();设置权限登录
修改ZkClientWrapper类中“createPersistent(Stringpath)”和“createEphemeral(String path)”创建节点设置权限:
改造curator是最简单的方式,因为dubbo使用curator已经考虑到zookeeper加ACL了,只是代码设置不生效罢了,只要稍微动一下即可。
修改CuratorZookeeperClient源码
从 2.6.0 版本开始缺省为 curator 实现,以提升 zookeeper 客户端的健状性,配置:
dubbo.registry.client=curator
zookeeper://10.20.153.10:2181?client=curator&username=admin&password=admin
启动之后即可实现对zookeeper添加权限控制啦。
dubbo的注册中心有:
1、Zookeeper(官方推荐)
优点:支持分布式.很多周边产品.
缺点: 受限于 Zookeeper 软件的稳定性.Zookeeper 专门分布式辅助软件,稳定较优
2、Multicast
优点:去中心化,不需要单独安装软件.
缺点:Provider 和 Consumer 和 Registry 不能跨机房(路由)
3、Redis
优点:支持集群,性能高
缺点:要求服务器时间同步.否则可能出现集群失败问题.
4、Simple
优点: 标准 RPC 服务.没有兼容问题
缺点: 不支持集群.
Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpda...
忙的时候项目期肯定要加班 但是每天加班应该还不至于
虽然Java人才越来越多,但是人才缺口也是很大的,我国对JAVA工程师的需求是所有软件工程师当中需求大的,达到全部需求量的60%-70%,所以Java市场在短时间内不可能饱和。其次,Java市场不断变化,人才需求也会不断增加。马云说过,未来的制造业要的不是石油,...
工信部证书含金量较高。工信部是国务院的下属结构,具有发放资质、证书的资格。其所发放的证书具有较强的权威性,在全国范围内收到认可,含金量通常都比较高。 工信部证书,其含义也就是工信部颁发并承认的某项技能证书,是具有法律效力的,并且是国家认可的...
学Java好不好找工作?看学完Java后能做些什么吧。一、大数据技术Hadoop以及其他大数据处理技术都是用Java或者其他,例如Apache的基于Java 的 HBase和Accumulo以及ElasticSearchas。但是Java在此领域并未占太大空间,但只要Hadoop和ElasticSearchas能够成长壮...
就是java的基础知识啊,比如Java 集合框架;Java 多线程;线程的五种状态;Java 虚拟机;MySQL (InnoDB);Spring 相关;计算机网络;MQ 消息队列诸如此类
#{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同,下面详细比较两者间的区别:1.#{} 是 占位符 :动态解析 ...
没问题的,专科学历也能学习Java开发的,主要看自己感不感兴趣,只要认真学,市面上的培训机构不少都是零基础课程,能跟得上,或是自己先找些资料学习一下。
1、反射对单例模式的破坏采用反射的方式另辟蹊径实例了该类,导致程序中会存在不止一个实例。解决方案其思想就是采用一个全局变量,来标记是否已经实例化过了,如果已经实例化过了,第 二次实例化的时候,抛出异常2、clone()对单例模式的破坏当需要实现单例的...
优点: 一、实例控制 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性 因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点: 一、开销 虽然数量很少,但如果每次对象请求引用时都要...
这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...
哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...
哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了...
是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间
解码查表优化算法,seo优化
1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。2.哈希值就是这个元素的位置。3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...
最多设置5个标签!
zookeeper是分布式服务架构,主要用来解决分布式应用中经常遇到的一些数据管理问题,比如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
zookeeper上节点最常用的5种操作权限:
Create、Read、Write、Delete、Admin也就是增、删、改、查、管理权限,简写crwda
(这五种权限中,delete是指对子节点删除权限,其他四种权限指本身节点权限)
身份验证有4中方式:
world:有个单一的ID,anyone,表示任何人。
auth:不使用任何ID,表示任何通过验证的用户(是通过ZK验证的用户?连接到此ZK服务器的用户?)。
digest:使用 用户名:密码
字符串生成MD5哈希值作为ACL标识符ID。权限的验证通过直接发送用户名密码字符串的方式完成,
ip:使用客户端主机ip地址作为一个ACL标识符,ACL表达式是以 addr/bits
这种格式表示的。ZK服务器会将addr的前bits位与客户端地址的前bits位来进行匹配验证权限。
看到了授权需要的模式是secheme????perm形式,下面就说说secheme
secheme介绍
world表示所有。创建节点的默认权限,有唯一的id是anyone授权的时候模式为world:anyone:rwcda
表示所有人都有对这个节点的rwcda权限。这里用的是id,而不是expression。
auth不需要id。不过这里应该用expression来表示。
digest使用用户名:密码编码成md5的方式作为访问权限列表id。但是这里id不作为授权语句的一部分,这里也是用expression方式。用户名:密码先进行shal编码后再用base64编码。这个比较恶心。
host使用用户主机作为访问空着列表的id。但是这里需要注意的是表达式用的主句的后缀即可。举个栗子:如果表达式设置为
corp.com 可以匹配 host1.corp.com 和
host2.corp.com的主机名,但是host1.zookeeper.com则不能匹配。
ip:跟主机名类似。这里使用客户端的ip地址作为权限访问列表的id。表达式可以用
addr/bits这种方式设置ip白名单。
常用加密命令:
方法一、auth设置权限
设置这个权限之前首先需要
addauth digest zookeeper:zookeeper
然后再设置auth
setAcl /test auth:zookeeper:zookeeper:crwda
检查权限
getAcl /test
可以看到权限已经设置成功了。
get /test
方法二、digest设置权限 (这个里面有个大坑)
可以看出比较明显的:
设置之前不需要通过addauth添加对应的授权认证,而是直接授权便可。
命令行设置了什么,然后在获取对应的权限的时候就会把对应的字符串显式记录下来,而不会进行任何编码,
如上面的zookeeper:zookeeper。这种方式就需要自己去编码了。
这也是个比较坑爹的事情,设置密码之前需要把密码先自己进行sha1编码然后吧结果进行base64编码。如果编码的方式错误你将永远失去这个节点的访问权。不编码就访问不了
使用sha1编码和base64编码之后设置digest方式保存起来
之后就可以使用addauth的方式访问啦
使用代码连接创建带权限的zookeeper节点
创建节点数据时:
读取Zookeeper数据时:
三、dubbo如何使用zookeeper作为注册中心
通常使用dubbo一般有四种方式,xml配置、API调用、properties加载、注解配置。使用zookeeper作为注册中心主要配置如下:
xml schema扩展
properties配置
API代码设置
注解配置
四、dubbo实现zookeeper权限关联
最近又把dubbo拾起来啦,以前用过dubbo,后来12年阿里巴巴不维护啦,后来随着springcloud的不断崛起,使用dubbo的人越来越少,但是在国内还是有好多dubbo的热爱着,也是因为这样,在2017年的时候阿里将dubbo奉献给Apache社区,后面估计会越来越好。
这个无论是之前阿里维护还是现在放到Apache社区,直到目前为止,dubbo都没做好这块,使用zookeeper加权限连接,其实挺简单的,下面大致讲以下怎么做。
这里做之前先说一下实现dubbo连接加权限的zookeeper有两种方式,这个取决于dubbo连接zookeeper是通过两种客户端连接的,分别是zkclient和curator,而且dubbo提前预留量注册中心变量设置用户名和密码,这里使用的zookeeper加权方式是digest方式,使用用户名和密码方式对zookeeper节点加权限。
这里需要注意的是,自从dubbo转到Apache下面之后,源码改动不少,其中在dubbo
2.6.0以后版本,dubbo将默认使用zkclient访问zookeeper改成了默认使用curator客户端访问。
而且在2.5.4版本之后将com.github.sgroschupf 下面的zkclient 0.1版本改成了
com.101tec 下面的zkclient 0.2版本啦。
1、改造zkclient客户端dubbo源码实现
替换zkclient jar包
这里无论是新版本还是旧版本,都需要将zkclient包替换成com.101tec
的0.5以上版本,因为只有0.5以上的版本才支持ACL加权控制。(本人建议使用0.8以上的版本)
如果你是2.5.4以前的版本(包括2.5.4版本,就是12年之后17年之前发布的最新版本)需要将
替换成
(这个之前版本比较麻烦,需要到源码中将所有的pom都需要修改)
如果你是使用2.5.4以后的版本比较简单,只需要将dubbo-parent中的
改成
dubbo使用zkclient客户端源码解析
这里简单的介绍也一下dubbo连接Zookeeper的实现原理,首先服务的提供者和消费者在RegistryProtocol利用注册中心暴露(export)和引用(refer)服务的时候会根据配置利用Dubbo的SPI机制获取具体注册中心注册器
这里的RegistryFactory是ZookeeperRegistryFactory看如下工厂代码
在这里创建zookeepr注册器ZookeeperRegistry。
ZookeeperTransporter是操作zookeepr的客户端的工厂类,用来创建zookeeper客户端,这里客户端并不是zookeeper源代码的自带的,而是采用第三方工具包,主要来简化对zookeeper的操作,例如用zookeeper做注册中心需要对zookeeper节点添加watcher做反向推送,但是每次回调后节点的watcher都会被删除,这些客户会自动维护了这些watcher,在自动添加到节点上去。
dubbo源码改造适配zookeeper添加ACL权限
这里又要分版本对待,对dubbo添加zookeeper权限适应于2.2.0-2.5.6版本之间dubbo使用者,2.5.6之后版本添加了ZkClientWrapper类,对zkclient又做成守护线程形式,需要进一步改造,后面也会专门提高2.5.6之后怎么改造的。
适配2.2.0-2.5.6版本之间dubbo源码改造
在使用zkClient
连接Zookeeper中最重要的一个类是ZkclientZookeeperClient,Zookeeper的连接、节点创建和节点访问都在这个类中,我们需要重点改造的类。
ZkclientZookeeperClient在构造函数中创建连接Zookeeper,在连接的时候使用用户名密码连接:
将ZkclientZookeeperClient中的“createPersistent(String
path)”和“createEphemeral(String path)”创建节点设置权限:
到目前为止,源码就改动这么多,连接Zookeeper的用户名和密码通过dubbo配置注册中心的时候配置,通过spring加载代URL中。
然后下面就说说具体怎么配置怎么用。
改造后的dubbo连接Zookeeper配置
从 2.2.0 版本开始缺省为 zkclient 实现,以提升 zookeeper 客户端的健状性,配置:
或
dubbo.registry.client=zkclient
dubbo.registry.username=admin
dubbo.registry.password=admin
或
zookeeper://10.20.153.10:2181?client=zkclient&username=admin&password=admin
到此直接启动即可,dubbo就可自动对注册dubbo的group节点添加ACL权限。
适配2.5.6以上版本dubbo源码改造
添加handleSessionEstablishmentError监控方法
重写ZkClientWrapper构造方法
针对client.start();设置权限登录
修改ZkClientWrapper类中“createPersistent(String
path)”和“createEphemeral(String path)”创建节点设置权限:
到目前为止,源码就改动这么多,连接Zookeeper的用户名和密码通过dubbo配置注册中心的时候配置,通过spring加载代URL中。
然后下面就说说具体怎么配置怎么用。
改造后的dubbo连接Zookeeper配置
从 2.2.0 版本开始缺省为 zkclient 实现,以提升 zookeeper 客户端的健状性,配置:
或
dubbo.registry.client=zkclient
dubbo.registry.username=admin
dubbo.registry.password=admin
或
zookeeper://10.20.153.10:2181?client=zkclient&username=admin&password=admin
到此直接启动即可,dubbo就可自动对注册dubbo的group节点添加ACL权限。
2、改造curator客户端dubbo源码实现
改造curator是最简单的方式,因为dubbo使用curator已经考虑到zookeeper加ACL了,只是代码设置不生效罢了,只要稍微动一下即可。
修改CuratorZookeeperClient源码
改造后的dubbo连接Zookeeper配置
从 2.6.0 版本开始缺省为 curator 实现,以提升 zookeeper 客户端的健状性,配置:
或
dubbo.registry.client=curator
dubbo.registry.username=admin
dubbo.registry.password=admin
或
zookeeper://10.20.153.10:2181?client=curator&username=admin&password=admin
启动之后即可实现对zookeeper添加权限控制啦。
至此源码已经全部修改完成。
dubbo的注册中心有:
1、Zookeeper(官方推荐)
优点:支持分布式.很多周边产品.
缺点: 受限于 Zookeeper 软件的稳定性.Zookeeper 专门分布式辅助软件,稳定较优
2、Multicast
优点:去中心化,不需要单独安装软件.
缺点:Provider 和 Consumer 和 Registry 不能跨机房(路由)
3、Redis
优点:支持集群,性能高
缺点:要求服务器时间同步.否则可能出现集群失败问题.
4、Simple
优点: 标准 RPC 服务.没有兼容问题
缺点: 不支持集群.
相关问题推荐
Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpda...
忙的时候项目期肯定要加班 但是每天加班应该还不至于
虽然Java人才越来越多,但是人才缺口也是很大的,我国对JAVA工程师的需求是所有软件工程师当中需求大的,达到全部需求量的60%-70%,所以Java市场在短时间内不可能饱和。其次,Java市场不断变化,人才需求也会不断增加。马云说过,未来的制造业要的不是石油,...
工信部证书含金量较高。工信部是国务院的下属结构,具有发放资质、证书的资格。其所发放的证书具有较强的权威性,在全国范围内收到认可,含金量通常都比较高。 工信部证书,其含义也就是工信部颁发并承认的某项技能证书,是具有法律效力的,并且是国家认可的...
学Java好不好找工作?看学完Java后能做些什么吧。一、大数据技术Hadoop以及其他大数据处理技术都是用Java或者其他,例如Apache的基于Java 的 HBase和Accumulo以及ElasticSearchas。但是Java在此领域并未占太大空间,但只要Hadoop和ElasticSearchas能够成长壮...
就是java的基础知识啊,比如Java 集合框架;Java 多线程;线程的五种状态;Java 虚拟机;MySQL (InnoDB);Spring 相关;计算机网络;MQ 消息队列诸如此类
#{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同,下面详细比较两者间的区别:1.#{} 是 占位符 :动态解析 ...
没问题的,专科学历也能学习Java开发的,主要看自己感不感兴趣,只要认真学,市面上的培训机构不少都是零基础课程,能跟得上,或是自己先找些资料学习一下。
1、反射对单例模式的破坏采用反射的方式另辟蹊径实例了该类,导致程序中会存在不止一个实例。解决方案其思想就是采用一个全局变量,来标记是否已经实例化过了,如果已经实例化过了,第 二次实例化的时候,抛出异常2、clone()对单例模式的破坏当需要实现单例的...
优点: 一、实例控制 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性 因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点: 一、开销 虽然数量很少,但如果每次对象请求引用时都要...
这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...
哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...
哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了...
是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间
解码查表优化算法,seo优化
1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。2.哈希值就是这个元素的位置。3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...