序列化
序列化
把数据对象(一般是内存中的,例如JVM中的对象)转换成字节序列的过程
(不是说一定要实现Serializable接口)
{"name":"zhangsan","age":20}
反序列化
把字节序列重新转换成内存中的对象
目的:让内存中的对象可以被存储和传输
序列化是编码吗?
严格来说不属于编码,因为不是从一种格式转换成另一种格式
Hash
定义:把任意数据转换成指定大小范围(通常很小)的数据
作用:摘要、数字指纹
经典算法:MD5、SHA1、SHA256等 (提取信息当做指纹)
例:
public void hash(String str){
return str.length();
}
hash("dog") == 3
hash("apple") == 5
hash("cat") == 3
其中dog和cat的hash值相同,被称为发生了碰撞;优秀的算法应该尽可能低的碰撞率。
而通过3可以推出其中一个原文,这被称为破解;优秀的算法应该防破解。
实际用途
(1)数据完成性验证
(2)快速查找:hashCode() 和HashMap
例:在重写equals时必须要重写hashCode,因为hashmap做判断会用hashCode,hashCode会快速简单的判断。
如果没有重写hashCode,可能会出现equals是相等的,但hashCode不等的情况
public class Example{
String name;
int age;
public boolean equals(Object o){
return agr == o && name.equals(o.name);
}
public int hashCode(){
return age * 10000 + name.length();
}
}
为什么不直接将equals的返回值返回hashCode呢?因为hashCode虽然很快,但是不够精确,
通常用来快速匹配不同
(3)隐私保护
例:
账户名:zhanghu
密码:123456
网站中存储的密码:123456
数据库被盗后,对方可以直接登录本网站甚至其他网站了
-----------------------------------------------------------
增强版:
网站存储:SHA1(123456) == qwertasd
之后的验证就是直接将用户密码做一次SHA运算,再来与数据库比对
这时数据库被盗,对方拿到的是SHA1密码,无法登录本网站和其他网站
但是,通过彩虹表可以推测密码
SHA1(123456) == QWERTY
SHA1(654321) == ASDERF
SHA1(111111) == WERQSS
拿到SHA1密码后会从右边推,如果有相同的,则会被破解。
-------------------------------------------------------------
预防上面的方法是“加盐”
例如:
盐:123
原密码 123456
网站加盐并SHA1 SHA1(123456123) == WEURHAS
这样即使被拖库,也无法通过彩虹表来推出来
Hash是编码吗?
不是的,不可逆。和有损压缩不一样。
Hash是加密码?据说MD5是 不可逆加密?
不是的,没有不可逆加密的说法
字符集
含义:一个由整数向现实世界中的文字符号的Map
分支:
ASCII:128个字符,1字节
ISO-8859-1:对ASCII进行扩充,1字节
Unicode:13万个字符,多字节(有两种意思,通用意思是字符集,是下面两个的父集;
另一种则是代表一种编码)
UTF-8:Unicode的编码分支
UTF-16:Unicode的编码分支
简单来说就是补位的方式不同
GBK/GB2312.GB18030:中国自研标准,多字节,字符集+编码(已经隐退)
网友评论