哈希

Java——hashCode 与 equals

≯℡__Kan透↙ 提交于 2020-02-17 14:21:31
hashCode 与 equals (重要) 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” hashCode()介绍 hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。 散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象) 为什么要有 hashCode 我们先以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode: 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。

哈希是什么?为什么哈希存取比较快?

随声附和 提交于 2020-02-16 07:56:35
  不太恰当的比喻:     XM 指的是“小明”,也指的是“小萌”     XM就是哈希值,小明和小萌就是拥有同一个哈希值的,存在同一个链表的元素。     想要获取小萌,首先使用hashcode获取到这两个人,然后再通过equals获取到小萌。   个人理解      哈希表其实就是一个一维数组,而数组中的每一个元素都是一个单向链表而已。这样的数据结构 解决了数组的增删元素的不足和链表的查询效率的不足 。    数组是存在连续的存储空间,而链表的存储空间不连续 --------------------------------   哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。   哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。   哈希通过将单向数学函数(有时称为“哈希算法”

经验整理-18-memcached-100-@

旧城冷巷雨未停 提交于 2020-02-15 19:10:47
memcached是怎么工作的? 当查询数据时,客户端 首先(参考节点列表)计算出入参key的哈希值(阶段一哈希),找到对应节点 ;然后 memcached节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item) 。 举个列子,假设有3个客户端1, 2, 3,3台memcached A, B, C: Client 1想把数据”barbaz”以key “foo”存储。Client 1首先参考节点列表(A, B, C),计算key “foo”的哈希值,假设memcached B被选中。接着,Client 1直接connect到memcached B,通过key “foo”把数据”barbaz”存储进去。  Client 2使用与Client 1相同的客户端库(意味着阶段一的哈希算法相同),也拥有同样的memcached列表(A, B, C)。 于是,经过相同的哈希计算(阶段一),Client 2计算出key “foo”在memcached B上,然后它直接请求memcached B,得到数据”barbaz”。 各种客户端在memcached中数据的存储形式是不同的(perl Storable, php serialize, java hibernate, JSON等)。一些客户端实现的哈希算法也不一样。但是,memcached服务器端的行为总是一致的。 最后,从实现的角度看

哈希算法(下):哈希算法在分布式系统中有哪些应用?

怎甘沉沦 提交于 2020-02-15 06:55:53
哈希算法(下):哈希算法在分布式系统中有哪些应用? 还有三种哈希算法的应用:负载均衡、数据分片、分布式存储 应用五:负载均衡 负载均衡的算法有很多,比如轮询、随机、加权轮询等,如何实现一个会话粘滞的负载均衡算法呢?即在同一个客户端上,在一次会话中的所有请求都路由到同一个服务器上 方法是:维护一张映射关系表,表中内容是客户端IP地址或者会话ID与服务器编号的映射关系,客户端发出的每次请求都需要先在映射表中查找应该路由到的服务器编号,再请求编号对应的服务器 可以借助哈希算法,对客户端IP地址或者会话ID计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号,这样就可以把同一个IP过来的所有请求都路由到同一个后端服务器上 应用六:数据分片 1.统计“搜索关键词”出现的次数 假如有1T日志文件,记录了用户的搜索关键词,需要快速统计出每个关键词被搜索的次数,怎么做? 两个难点:一是搜索日志很大,没有办法放到一台机器内存中去,二是如果只用一台机器处理的话花费时间很长 先对数据进行分片,然后采用多台机器处理的方法,来提高速度,思路是:用n台机器并行处理,从搜索记录的日志文件中依次读出每个搜索关键词,并通过哈希函数计算哈希值,再跟n取模,最终得到的值就是应该被分配到的机器编号,这样哈希值相同的搜索关键词就被分配到同一机器上

Redis是什么

烈酒焚心 提交于 2020-02-14 05:57:57
redis是Nosql数据库,是一个key-value存储系统。可用于缓存,事件发布或订阅,高速队列等场景。该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。虽然redis是key-value的存储系统,但是redis支持的value存储类型是非常的多,比如字符串、链表、集合、有序集合和哈希。 那么为什么要使用类似redis这样的Nosql数据库呢? 1) 当数据量的总大小一个机器放不下时; 2) 数据索引一个机器的内存放不下时; 3) 访问量(读写混合)一个实例放不下 1,redis是什么 redis 是一种支持Key-Value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。 2,支持的语言 3,redis的应用场景有哪些 1,会话缓存(最常用) 2,消息队列, 比如支付3,活动排行榜或计数 4,发布,订阅消息(消息通知) 5,商品列表,评论列表等 4,redis数据类型 Redis 一共支持五种数据类:string(字符串),hash(哈希),list(列表),set(集合)和zset(sorted set有序集合)。 (1)字符串(字符串) 它是redis的最基本的数据类型

HashMap(一)基础入门

人盡茶涼 提交于 2020-02-13 10:58:13
1.数组的优势/劣势 数组的内存空间是连续的 特点:索引速度快 劣势:增加、删除数据时,浪费性能 2.链表的优势/劣势 链表不是连续的内存,每一块内存中有一个引用保存下一个内存的地址。 优势:增加、删除数据时,效率高 劣势:如果要访问最后一个元素,只能从头依次访问每一个内存,查询效率低 3.有没有一种方式整合两种数据的优势? 散列表。 整合了数组的快速索引,和链表的动态扩容 4.什么是哈希? 核心理论:Hash也称散列、哈希,基本理论就是把 任意长度 的输入,通过Hash算法变成 固定长度 的输出。 这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值。 Hash的特点: 从hash值不可以反向推导出原始的数据 输入的数据的微小变化会得到完全不同的hash值,相同的数据会得到相同的值 哈希算法的执行效率高效,长的文本也能快速计算出哈希值。 hash算法的冲突概率要小 由于hash的原理是将输入空间的值映射成hash空间内,而hash值的空间远小于输入的空间。 根据抽屉原理,一定会在不同的输入被映射成相同输出情况。 抽屉原理:桌上有十个苹果 ,要把这十个苹果放到九个抽屉里,无论怎么放,我们会发现至少会有一个抽屉里面放不少于两个苹果。 这一现象就是我们所说的“抽屉原理” 来源: CSDN 作者: 梨子果果哟 链接: https://blog.csdn.net/qq

C++-POJ1021-2D-Nim[hash]

心不动则不痛 提交于 2020-02-11 14:24:46
哈希 ,对于 每个点 哈希一次 哈希的方式:该点到联通分量边界(上下左右)的距离和 然后分别对两个图的n个点按hash值排序,判断是否相等即可 1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <cstring> 9 #include <iostream> 10 #include <algorithm> 11 using namespace std; 12 struct point{int x,y;}p[10001]; 13 int T,W,H,n,flag,a[100][100],hash[2][10001]; 14 int main(){ 15 for(scanf("%d",&T);T--;){ 16 scanf("%d%d%d",&W,&H,&n); 17 memset(hash,0,sizeof(hash)); 18 for(int c=0;c<=1;c++){ 19 memset(a,0,sizeof(a)); 20 for(int i=1;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y),a[p[i].x]

你见过凌晨四点破解密码的john吗?

為{幸葍}努か 提交于 2020-02-11 12:14:31
“ 凌晨四点 ” , 一个很有意义的代名词!这几个字最初是在科比的训练场上留下来的话!很励志、很艰辛,同时我们也为科比的不幸而感到惋惜~ 前人给我们留下的不只是回忆,更多的是精神上的鼓励与支持!他们那些励志的行动,值得我们去学习! 好了,鸡汤叙述完毕!下面开始我们的密码破解! 今天要讲的就是名副其实的开膛手约翰(John Ripper)。该工具可谓是功能丰富而且又能快速破解!下图给大家查看一下John目录下的文件,可知道该工具是由Python开创的。 所以该工具可以用在多个平台上,比如Windows , Linux , Mac OS , Android,开箱即用!并且是一个开源项目:https://github.com/magnumripper/JohnTheRipper/releases。 它是最流行的密码测试和破解程序之一,因为它将许多密码破解程序组合到一个程序包中,自动检测密码哈希类型,并包括一个可自定义的破解程序。可以针对各种加密的密码格式运行它,比如各种Unix版本(基于DES,MD5或Blowfish),Kerberos AFS和Windows 的各版本中常见的几种加密密码哈希类型。其他模块已扩展其功能,包括基于MD4的密码哈希和存储在LDAP、MySQL等中的密码。 在破解密码方面,有三种类型的攻击: 1.暴力破解:通过依次处理每个可能的字母

你见过凌晨四点破解密码的john吗?

爷,独闯天下 提交于 2020-02-11 11:54:25
“ 凌晨四点 ” , 一个很有意义的代名词!这几个字最初是在科比的训练场上留下来的话!很励志、很艰辛,同时我们也为科比的不幸而感到惋惜~ 前人给我们留下的不只是回忆,更多的是精神上的鼓励与支持!他们那些励志的行动,值得我们去学习! 好了,鸡汤叙述完毕!下面开始我们的密码破解! 今天要讲的就是名副其实的开膛手约翰(John Ripper)。该工具可谓是功能丰富而且又能快速破解!下图给大家查看一下John目录下的文件,可知道该工具是由Python开创的。 所以该工具可以用在多个平台上,比如Windows , Linux , Mac OS , Android,开箱即用!并且是一个开源项目:https://github.com/magnumripper/JohnTheRipper/releases。 它是最流行的密码测试和破解程序之一,因为它将许多密码破解程序组合到一个程序包中,自动检测密码哈希类型,并包括一个可自定义的破解程序。可以针对各种加密的密码格式运行它,比如各种Unix版本(基于DES,MD5或Blowfish),Kerberos AFS和Windows 的各版本中常见的几种加密密码哈希类型。其他模块已扩展其功能,包括基于MD4的密码哈希和存储在LDAP、MySQL等中的密码。 在破解密码方面,有三种类型的攻击: 1.暴力破解:通过依次处理每个可能的字母

一致性哈希实现负载均衡

丶灬走出姿态 提交于 2020-02-11 01:47:35
一致性哈希实现负载均衡 1 为什么需要哈希算法 解决同一个用户访问服务器是,访问的是不同的服务器的问题 场景:集群造成的session没有同步 当一个用户访问服务器A的时候,该台服务器A会保存这台服务器的session,但是当下次再访问的时候,被负载均衡算法可能算到了不同的服务器B,服务器B中没有用户的session,会要求用户再次登录。 解决: 加入redis,将session存到redis中 Tomcat同步session 一致性哈希算法 2 什么是一致性哈希算法 服务器集群接收到一次请求调用时,可以根据请求的信息,比如客户端的ip地址,或请求路径与请求参数等信息进行哈希,可以得出一个哈希值,特点是对于相同的ip地址,或请求路径和请求参数哈希出来的值是一样的,只要能再增加一个算法,能够把这个哈希值映射成一个服务端ip地址,就可以使用相同的请求(相同的ip地址,或请求路径和请求参数)落到同一服务器上。 因为客户端发起的请求是无穷无尽的(客户端地址不同,请求参数不同等等),所以对于的哈希值也是无穷大的,所以我们不能把所有的哈希值都进行映射到服务端ip上,所有这里需要用到 哈希环 。 3 虚拟节点 解决一个服务器挂掉造成的服务不均匀问题 使得哈希环更加平滑 当时当一台服务器挂掉的话,会造成服务器服务不均匀的情况 会发现,ip3和ip1直接的范围是比较大的,会有更多的请求落到ip1上