SHA算法(及示例)演变历史
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
家族成员
SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。SHA-1在许多安全协定中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的杂凑函数)的后继者。但SHA-1的安全性如今被密码学家严重质疑;虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的杂凑算法。 [1]
SHA-0和1
SHA-0破解
SHA-1破解
SHA-1算法
Initialize variables:
h0 := 0x67452301
h1 := 0xEFCDAB89
h2 := 0x98BADCFE
h3 := 0x10325476
h4 := 0xC3D2E1F0
Pre-processing:
append the bit '1' to the message
append k bits '0', where k is the minimum number >= 0 such that the resulting message
length (in bits) is congruent to 448 (mod 512)
append length of message (before pre-processing), in bits, as 64-bit big-endian integer
Process the message in successive 512-bit chunks:
break message into 512-bit chunks
for each chunk
break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15
Extend the sixteen 32-bit words into eighty 32-bit words:
for i from 16 to 79
w[i] := (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1
Initialize hash value for this chunk:
a := h0
b := h1
c := h2
d := h3
e := h4
Main loop:
for i from 0 to 79
if 0 ≤ i ≤ 19 then
f := (b and c) or ((not b) and d)
k := 0x5A827999
else if 20 ≤ i ≤ 39
f := b xor c xor d
k := 0x6ED9EBA1
else if 40 ≤ i ≤ 59
f := (b and c) or (b and d) or (c and d)
k := 0x8F1BBCDC
else if 60 ≤ i ≤ 79
f := b xor c xor d
k := 0xCA62C1D6
temp := (a leftrotate 5) + f + e + k + w[i]
e := d
d := c
c := b leftrotate 30
b := a
a := temp
Add this chunk's hash to result so far:
h0 := h0 + a
h1 := h1 + b
h2 := h2 + c
h3 := h3 + d
h4 := h4 + e
Produce the final hash value (big-endian):
digest = hash = h0 append h1 append h2 append h3 append h4
SHA-2
应用
哈希表介绍
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
15 111 % 15

问题
有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址..),当输入该员工的id时,要求查找到该员工的 所有信息.
要求:
不使用数据库,,速度越快越好=>哈希表(散列)
添加时,保证按照id从低到高插入 [课后思考:如果id不是从低到高插入,但要求各条链表仍是从低到高,怎么解决?]
使用链表来实现哈希表, 该链表不带表头[即: 链表的第一个结点就存放雇员信息]
思路分析并画出示意图
代码实现[增删改查(显示所有员工,按id查询)]

代码实现
1 package cn.smallmartial.hashTable;
2
3 import java.util.HashMap;
4 import java.util.Scanner;
5
6 /**
7 * @Author smallmartial
8 * @Date 2019/6/13
9 * @Email smallmarital@qq.com
10 */
11 public class HashTableDemo {
12
13 public static void main(String[] args) {
14 //创建hash表
15 HashTab hashTab = new HashTab(7);
16
17 //写一个简单的菜单
18 String key = "";
19 Scanner scanner = new Scanner(System.in);
20 while(true) {
21 System.out.println("add: 添加雇员");
22 System.out.println("list: 显示雇员");
23 System.out.println("find: 查找雇员");
24 System.out.println("exit: 退出系统");
25
26 key = scanner.next();
27 switch (key) {
28 case "add":
29 System.out.println("输入id");
30 int id = scanner.nextInt();
31 System.out.println("输入名字");
32 String name = scanner.next();
33 //创建 雇员
34 Emp emp = new Emp(id, name);
35 hashTab.add(emp);
36 break;
37 case "list":
38 hashTab.list();
39 break;
40 case "find":
41 System.out.println("请输入要查找的id");
42 id = scanner.nextInt();
43 hashTab.findEmpById(id);
44 break;
45 case "exit":
46 scanner.close();
47 System.exit(0);
48 default:
49 break;
50 }
51 }
52 }
53 }
54 //创建hashTab
55 class HashTab{
56 private int size;
57 private EmpLinkedList[] empLinkedListArray;
58
59 public HashTab(int size) {
60 this.size = size;
61 empLinkedListArray = new EmpLinkedList[size];
62
63 for (int i = 0; i < size; i++) {
64 empLinkedListArray[i] = new EmpLinkedList();
65 }
66
67 }
68
69 //添加雇员
70 public void add(Emp emp){
71 //根据员工ID 添加到哪条联
72 int hashFun = hashFun(emp.id);
73 empLinkedListArray[hashFun].add(emp);
74
75 }
76
77 //遍历链表
78 public void list(){
79 for (int i = 0; i < size; i++) {
80 empLinkedListArray[i].list(i);
81 }
82 }
83
84 //根据输入的id,查找雇员
85 public void findEmpById(int id) {
86 //使用散列函数确定到哪条链表查找
87 int empLinkedListNO = hashFun(id);
88 Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id);
89 if(emp != null) {//找到
90 System.out.printf("在第%d条链表中找到 雇员 id = %d\n", (empLinkedListNO + 1), id);
91 }else{
92 System.out.println("在哈希表中,没有找到该雇员~");
93 }
94 }
95 public int hashFun(int id){
96 return id % size;
97 }
98 }
99 //表示雇员
100 class Emp {
101 public int id;
102 public String name;
103 public Emp next;
104
105 public Emp(int id, String name) {
106 this.id = id;
107 this.name = name;
108 }
109 }
110 //表示链表
111 class EmpLinkedList{
112 private Emp head;
113
114 public void add(Emp emp){
115 if (head == null){
116 head = emp;
117 return;
118 }
119
120 Emp curEmp = head;
121 while (true){
122 if (curEmp.next == null){
123 break;
124 }
125 curEmp = curEmp.next;
126 }
127 curEmp.next = emp;
128 }
129
130 //遍历
131 public void list(int no){
132 if (head == null){
133 System.out.println("第"+no+"前链表为空");
134 return;
135 }
136 System.out.print("第"+no+"链表信息为:");
137 Emp curEmp = head;
138 while (true){
139 System.out.print(curEmp.id+"=>"+curEmp.name);
140 if (curEmp.next == null){
141 break;
142 }
143 curEmp = curEmp.next;
144 }
145 System.out.println();
146 }
147
148 //根据id查找雇员
149 //如果查找到,就返回Emp, 如果没有找到,就返回null
150 public Emp findEmpById(int id) {
151 //判断链表是否为空
152 if(head == null) {
153 System.out.println("链表为空");
154 return null;
155 }
156 //辅助指针
157 Emp curEmp = head;
158 while(true) {
159 if(curEmp.id == id) {//找到
160 break;//这时curEmp就指向要查找的雇员
161 }
162 //退出
163 if(curEmp.next == null) {//说明遍历当前链表没有找到该雇员
164 curEmp = null;
165 break;
166 }
167 curEmp = curEmp.next;//以后
168 }
169
170 return curEmp;
171 }
172 }
SHA算法(及示例)演变历史的更多相关文章
- 如何生成安全的密码 Hash:MD5, SHA, PBKDF2, BCrypt 示例
密码 Hash 值的产生是将用户所提供的密码通过使用一定的算法计算后得到的加密字符序列.在 Java 中提供很多被证明能有效保证密码安全的 Hash 算法实现,我将在这篇文章中讨论其中的部分算法. 需 ...
- 前端文摘:Web 开发模式演变历史和趋势
今天的<前端文摘>给大家分享一篇玉伯的文章.文章详细介绍了 Web 开发的四种常用模式以及未来可能成为流行趋势的 Node 全栈开发模式,相信你看了以后一定会有收获. 您可能感兴趣的相关文 ...
- Web 开发模式演变历史和趋势
前不久徐飞写了一篇很好的文章:Web 应用的组件化开发.本文尝试从历史发展角度,说说各种研发模式的优劣. 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 ...
- [转] Web 开发模式演变历史和趋势
文章转自梦想天空--前端文摘:Web 开发模式演变历史和趋势 一.简单明快的早期时代 可称之为 Web 1.0 时代,非常适合创业型小项目,不分前后端,经常 3-5 人搞定所有开发.页面由 JSP.P ...
- SHA算法摘要处理
byte[] input="sha".getBytes();//待做消息摘要算法的原始信息,可以是任意字符串 MessageDigest sha=MessageDigest.get ...
- 密码学系列之:NIST和SHA算法
目录 简介 SHA1 SHA2 SHA3 简介 SHA算法大家应该都很熟悉了,它是一个用来计算hash的算法,目前的SHA算法有SHA1,SHA2和SHA3种.这三种算法都是由美国NIST制定的. N ...
- SHA算法
安全Hash函数(SHA)是使用最广泛的Hash函数.由于其他曾被广泛使用的Hash函数都被发现存在安全隐患,从2005年至今,SHA或许是仅存的Hash算法标准. SHA发展史 SHA由美国标准与技 ...
- C#与JAVA平台RSA算法交互示例
很久以前的文章中,演示了如何对于.net和win32下面的delphi的RSA互操作性的实现,对于C#和JAVA之前的RSA加密解密也是很简单的,一般都采用了标准的规范,所以在互操作性方面是很方便的. ...
- floodfill算法解题示例
Flood fill算法是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法.因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名.在GNU Go和扫雷中,Floo ...
随机推荐
- 3D建模服务提供更高效、专业的3D制作能力,“筑”力开发者
3D建模服务(3D Modeling Kit)是HMS Core在图形图像领域又一技术开放.3D建模产品的定位就是要做快速.简洁.低成本的3D制作能力,并陆续开放给有3D模型.动画游戏制作等能力诉求的 ...
- 计算机电子书 2017 BiliDrive 备份
下载方式 根据你的操作系统下载不同的 BiliDrive 二进制. 执行: bilidrive download <link> 链接 文档 链接 斯坦福 cs224d 深度学习与自然语言处 ...
- bom案例3-放大镜
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Java UDP实现聊天功能代码【转】
感谢大佬大佬!!!:https://www.cnblogs.com/woshijpf/p/3735684.html 我以前经常写的是基于TCP的网络编程,由于TCP建立连接鼻血要经过三次握手连接,服务 ...
- java中的静态变量,静态方法与静态代码块详解
java中的类的生命周期分为装载,连接,初始化,使用,和卸载五个过程. 而静态代码在类的初始化阶段被初始化. 而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静 ...
- VMware中Ubuntu18配置静态IP地址
1. VMware:编辑 -> 虚拟网络编辑器 -> 更改设置 2. 取消选中:使用本地DHCP服务将IP地址分配给虚拟机,并记住子网ip 3. 点击NAT设置,记住网关地址 正常情况下V ...
- python数据分析之numpy、matplotlib的使用
5.3 Python的科学计算包 - Numpy numpy(Numerical Python extensions)是一个第三方的Python包,用于科学计算.这个库的前身是1995年就开始开发的一 ...
- c++ 文本处理
c++ 文本处理 1.使用sstream版本 (1)功能:截取第一列为1以后的数据,如下图,截取第5行(包括第5行)以后的数据,前面4行数据丢弃. (2)代码:textProc.cc #include ...
- Python基础—编码(Day2)
一.字符编码 1.ASCII码:包含英文.数字.特殊字符,8位=1字节byte =1个字符,如: 0010 1010 ASCII码表里的字符总共有256个,前128个为常用的字符如运算符,后128个称 ...
- 关于TP90 TP99 等常用于评估软件系统的处理性能的指标概念
工作中还是蛮少直接接触到评估系统性能的,但是不妨碍有兴趣了解.认为这是常识,只是个人才疏学浅不了解其定义. TP=Top Percentile,Top百分数,是一个统计学里的术语,与平均数.中位数都是 ...