hash

Java 集合 HashMap & HashSet 拾遗

牧云@^-^@ 提交于 2020-02-22 20:35:14
Java 集合 HashMap & HashSet 拾遗 @author ixenos 摘要:HashMap内部结构分析 Java HashMap采用的是冲突链表方式 从上图容易看出,如果 选择合适的散列函数, put() 和 get() 方法可以在常数时间内完成,因为较好的散列减少了散列冲突,使时间主要花在对桶寻址上(数组) ,而较少去遍历桶中的链表。但在对HashMap 进行迭代时,需要遍历整个table以及后面跟的冲突链表 。因此对于迭代比较频繁的场景,不宜将HashMap的初始大小设的过大。 有两个参数可以影响HashMap的性能:初始容量(inital capacity)和负载系数(load factor) 。初始容量指定了初始 table 的大小,负载系数用来指定自动扩容的临界值。当 entry 的数量超过 capacity*load_factor 时,容器将自动扩容并重新哈希。对于插入元素较多的场景,将初始容量设大可以减少重新哈希的次数。 将对向放入到HashMap或HashSet中时,有两个方法需要特别关心: hashCode() 和 equals() 。 hashCode() 方法决定了对象会被放到哪个 bucket 里,当多个对象的哈希值冲突时, equals() 方法决定了这些对象是否是“同一个对象” 。所以,如果要将自定义的对象放入到 HashMap 或

一次性搞清楚equals和hashCode

試著忘記壹切 提交于 2020-02-22 00:28:08
  在程序设计中,有很多的“公约”,遵守约定去实现你的代码,会让你避开很多坑,这些公约是前人总结出来的设计规范。   Object类是Java中的万类之祖,其中,equals和hashCode是2个非常重要的方法。   这2个方法总是被人放在一起讨论。最近在看集合框架,为了打基础,就决定把一些细枝末节清理掉。一次性搞清楚! 下面开始剖析。 public boolean equals(Object obj)   Object类中默认的实现方式是 : return this == obj 。那就是说,只有this 和 obj引用同一个对象,才会返回true。(如果我们没有重写equals方法,equals和==一样比较的都是内存地址,只是equals可以让我们重写。)   而我们往往需要用equals来判断 2个对象是否等价,而非验证他们的唯一性。这样我们在实现自己的类时,就要重写equals. 按照约定,equals要满足以下规则。 自反性 : x.equals(x) 一定是true 对null : x.equals(null) 一定是false 对称性 : x.equals(y) 和 y.equals(x)结果一致 传递性: a 和 b equals , b 和 c equals,那么 a 和 c也一定equals。 一致性: 在某个运行时期间

eqauls和hashCode的对比

*爱你&永不变心* 提交于 2020-02-22 00:27:18
public boolean equals(Object obj) Object类中默认的实现方式是 : return this == obj 。那就是说,只有this 和 obj引用同一个对象,才会返回true。 而我们往往需要用equals来判断 2个对象是否等价,而非验证他们的唯一性。这样我们在实现自己的类时,就要重写equals. 按照约定,equals要满足以下规则: 自反性 : x.equals(x) 一定是true 对null : x.equals(null) 一定是false 对称性 : x.equals(y) 和 y.equals(x)结果一致 传递性 : a 和 b equals , b 和 c equals,那么 a 和 c也一定equals。 一致性 : 在某个运行时期间,2个对象的状态的改变不会不影响equals的决策结果,那么,在这个运行时期间,无论调用多少次equals,都返回相同的结果。 一个例子 class Test { private int num; private String data; public boolean equals(Object obj) { if (this == obj) return true; if ((obj == null) || (obj.getClass() != this.getClass()))

Git is moving to new hashing algorithm SHA-256 but why git community settled on SHA‑256

醉酒当歌 提交于 2020-02-20 11:17:25
问题 I just learned from this HN-post that git is moving to new hashing algorithm ( from SHA-1 to SHA-256 ) I wanted to know what makes SHA-256 best fit for git's use case. Is there any/many strong technical reason or is it possible that SHA-256 popularity is a strong factor ? ( I am making a guess ) Looking at https://en.wikipedia.org/wiki/Comparison_of_cryptographic_hash_functions page I see thee are many modern and older alternatives present. some of them are more ( almost same if not more )

HashMap源码详解

帅比萌擦擦* 提交于 2020-02-20 08:47:52
概述 HashMap是基于哈希表(散列表),实现Map接口的双列集合,数据结构是“链表散列”,也就是数组+链表 ,key唯一的value可以重复,允许存储null 键null 值,元素无序。 哈希表 数组:一段连续控件存储数据,指定下标的查找,时间复杂度O(1),通过给定值查找,需要遍历数组,自已对比复杂度为O(n) 二分查找插值查找,复杂度为O(logn) 线性链表:增 删除仅处理结点,时间复杂度O(1)查找需要遍历也就是O(n) 二叉树:对一颗相对平衡的有序二叉树,对其进行插入,查找,删除,平均复杂度O(logn) 哈希表:哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成,时间复杂度为O(1)哈希表的主干就是数组 hash冲突 如果两个不同的元素,通过哈希函数得出的实际存储地址相同怎么办?也就是说,当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞。前面我们提到过,哈希函数的设计至关重要,好的哈希函数会尽可能地保证 计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。那么哈希冲突如何解决呢?哈希冲突的解决方案有多种:开放定址法(发生冲突

HashMap

元气小坏坏 提交于 2020-02-20 05:10:17
https://www.cnblogs.com/aobing/p/12014271.html HashMap是我们非常常用的数据结构,由 数组和链表组合构成 大概如下,数组里面每个地方都存了Key-Value这样的实例,在Java7叫Entry在Java8中叫Node。 因为他本身所有的位置都为null,在put插入的时候会根据key的hash去计算一个index值。 你提到了还有链表,为啥需要链表,链表又是怎么样子的呢? 我们都知道数组长度是有限的,在有限的长度里面我们使用哈希,哈希本身就存在概率性,就是”帅丙“和”丙帅“我们都去hash有一定的概率会一样,就像上面的情况我再次哈希”丙帅“极端情况也会hash到一个值上,那就形成了链表。 每一个节点都会保存自身的hash、key、value、以及下个节点,我看看Node的源码。 来源: https://www.cnblogs.com/ywsheng/p/12016418.html

彻底理解windows 2

我的梦境 提交于 2020-02-19 18:43:46
NTLM v2协议 NTLM v1与NTLM v2最显著的区别就是challenge与加密算法不同,共同点就是加密的原料都是NTLM Hash。 不同之处: Challenge:NTLM v1的challenge有8位,NTLM v2的challenge为16位。 Net-NTLM Hash:NTLM v1的主要加密算法是DES,NTLM v2的主要加密算法是HMAC-MD5. Pass The Hash (哈希传递) 在内网渗透中,我们经常会需要抓取管理员的密码、NTLM Hash,尤其是域环境下。 ·什么是哈希传递? 哈希传递是能够在不需要账户明文密码的情况下完成认证的一个技术。 ·哈希传递的作用? 解决了我们渗透中获取不到明文密码、破解不了NTLM Hash而又想扩大战果的问题。 Pass The Hash 必要条件 ·哈希传递需要被认证的主机能够访问到服务器 ·哈希传递需要被传递认证的用户名 ·哈希传递需要被传递认证用户的NTLM Hash Pass The Hash 工具 三、Active Directory(活动目录)概念 ·Active Directory存储了有关网络对象的信息,并且让管理员和用户能够轻松地查找和使用这些信息。Active Directory使用了一种结构化地数据存储方式,并以此作为基础对目录信息进行合乎逻辑的分层组织。 ·网络对象分为:用户、用户组

用户密码到底要怎么加密存储?

℡╲_俬逩灬. 提交于 2020-02-19 12:03:27
作为互联网公司的信息安全从业人员经常要处理撞库扫号事件,产生撞库扫号的根本原因是一些企业发生了信息泄露事件,且这些泄露数据未加密或者加密方式比较弱,导致黑客可以还原出原始的用户密码。 目前已经曝光的信息泄露事件至少上百起,其中包括多家一线互联网公司,泄露总数据超过10亿条。 要完全防止信息泄露是非常困难的事情,除了防止黑客外,还要防止内部人员泄密。但如果采用合适的算法去加密用户密码,即使信息泄露出去,黑客也无法还原出原始的密码(或者还原的代价非常大)。 也就是说我们可以将工作重点从防止泄露转换到防止黑客还原出数据。下面我们将分别介绍用户密码的加密方式以及主要的破解方法。 一、用户密码加密 用户密码保存到数据库时,常见的加密方式有哪些,我们该采用什么方式来保护用户的密码呢?以下几种方式是常见的密码保存方式: 1、直接明文保存 ,比如用户设置的密码是“123456”,直接将“123456”保存在数据库中,这种是最简单的保存方式,也是最不安全的方式。但实际上不少互联网公司,都可能采取的是这种方式。 2、使用对称加密算法来保存 ,比如3DES、AES等算法,使用这种方式加密是可以通过解密来还原出原始密码的,当然前提条件是需要获取到密钥。不过既然大量的用户信息已经泄露了,密钥很可能也会泄露,当然可以将一般数据和密钥分开存储、分开管理,但要完全保护好密钥也是一件非常复杂的事情

Is It okay to save user's salt in the same table as password hash?

安稳与你 提交于 2020-02-18 21:00:32
问题 Is it okay and isn't useless? It could be saved in another table or even another database. What do you think? P.S. For higher security, I have the constant salt "peanuts" too. It's constant value saved in configuration file (not in database). So if hacker want to somehow hack password, he need access to file server and database as well. 回答1: Yes, it's okay to store the per-user salt in the same table which stores the password hash ( not the password itself ) - even if the adversary gets