哈希算法
Hash,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值
哈希算法特点
- 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
- 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
- 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
- 冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。
HashMap 实现
import java.util.Objects;
public class MyHashMap {
private Entry[] table = null;
private Integer tableDefaultLength = 8;
class Entry<K, V>{
private K k;
private V v;
private Entry next;
public Entry(K k, V v, Entry next) {
this.k = k;
this.v = v;
this.next = next;
}
}
public String put(String k, String v){
if (Objects.isNull(table)){
initTable();
}
int hashCode = k.hashCode();
int index = getIndex(hashCode);
if (Objects.nonNull(table[index])){
for (Entry entry = table[index]; entry != null; entry = entry.next){
if (entry.k.equals(k)){
Object o = entry.v;
entry.v = v;
return (String) o;
}
}
}
Entry headEntry = table[index];
Entry headEntryNew = new Entry(k ,v , headEntry);
table[index] = headEntryNew;
return null;
}
public String get(String k){
int hashCode = k.hashCode();
int index = getIndex(hashCode);
if (Objects.nonNull(table[index])){
for (Entry entry = table[index]; entry != null; entry = entry.next){
if (entry.k.equals(k)){
return (String) entry.v;
}
}
}
return null;
}
private int getIndex(int hashCode) {
return hashCode % tableDefaultLength;
}
private void initTable() {
table = new Entry[tableDefaultLength];
}
public static void main(String[] args) {
MyHashMap map = new MyHashMap();
System.out.println(map.put("1", "1value"));
System.out.println(map.put("2", "2value"));
System.out.println(map.put("1", "1.1value"));
System.out.println(map.get("1"));
System.out.println(map.get("2"));
}
}