序列化
序列化
把數(shù)據(jù)對(duì)象(一般是內(nèi)存中的沾凄,例如JVM中的對(duì)象)轉(zhuǎn)換成字節(jié)序列的過程
(不是說一定要實(shí)現(xiàn)Serializable接口)
{"name":"zhangsan","age":20}
反序列化
把字節(jié)序列重新轉(zhuǎn)換成內(nèi)存中的對(duì)象
目的:讓內(nèi)存中的對(duì)象可以被存儲(chǔ)和傳輸
序列化是編碼嗎?
嚴(yán)格來說不屬于編碼,因?yàn)椴皇菑囊环N格式轉(zhuǎn)換成另一種格式
Hash
定義:把任意數(shù)據(jù)轉(zhuǎn)換成指定大小范圍(通常很小)的數(shù)據(jù)
作用:摘要、數(shù)字指紋
經(jīng)典算法:MD5鸭你、SHA1、SHA256等 (提取信息當(dāng)做指紋)
例:
public void hash(String str){
return str.length();
}
hash("dog") == 3
hash("apple") == 5
hash("cat") == 3
其中dog和cat的hash值相同擒权,被稱為發(fā)生了碰撞袱巨;優(yōu)秀的算法應(yīng)該盡可能低的碰撞率。
而通過3可以推出其中一個(gè)原文碳抄,這被稱為破解愉老;優(yōu)秀的算法應(yīng)該防破解。
實(shí)際用途
(1)數(shù)據(jù)完成性驗(yàn)證
(2)快速查找:hashCode() 和HashMap
例:在重寫equals時(shí)必須要重寫hashCode纳鼎,因?yàn)閔ashmap做判斷會(huì)用hashCode俺夕,hashCode會(huì)快速簡單的判斷裳凸。
如果沒有重寫hashCode,可能會(huì)出現(xiàn)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呢姨谷?因?yàn)閔ashCode雖然很快,但是不夠精確映九,
通常用來快速匹配不同
(3)隱私保護(hù)
例:
賬戶名:zhanghu
密碼:123456
網(wǎng)站中存儲(chǔ)的密碼:123456
數(shù)據(jù)庫被盜后梦湘,對(duì)方可以直接登錄本網(wǎng)站甚至其他網(wǎng)站了
-----------------------------------------------------------
增強(qiáng)版:
網(wǎng)站存儲(chǔ):SHA1(123456) == qwertasd
之后的驗(yàn)證就是直接將用戶密碼做一次SHA運(yùn)算,再來與數(shù)據(jù)庫比對(duì)
這時(shí)數(shù)據(jù)庫被盜件甥,對(duì)方拿到的是SHA1密碼捌议,無法登錄本網(wǎng)站和其他網(wǎng)站
但是,通過彩虹表可以推測密碼
SHA1(123456) == QWERTY
SHA1(654321) == ASDERF
SHA1(111111) == WERQSS
拿到SHA1密碼后會(huì)從右邊推引有,如果有相同的瓣颅,則會(huì)被破解。
-------------------------------------------------------------
預(yù)防上面的方法是“加鹽”
例如:
鹽:123
原密碼 123456
網(wǎng)站加鹽并SHA1 SHA1(123456123) == WEURHAS
這樣即使被拖庫譬正,也無法通過彩虹表來推出來
Hash是編碼嗎宫补?
不是的,不可逆曾我。和有損壓縮不一樣粉怕。
Hash是加密碼?據(jù)說MD5是 不可逆加密抒巢?
不是的贫贝,沒有不可逆加密的說法
字符集
含義:一個(gè)由整數(shù)向現(xiàn)實(shí)世界中的文字符號(hào)的Map
分支:
ASCII:128個(gè)字符,1字節(jié)
ISO-8859-1:對(duì)ASCII進(jìn)行擴(kuò)充蛉谜,1字節(jié)
Unicode:13萬個(gè)字符稚晚,多字節(jié)(有兩種意思,通用意思是字符集型诚,是下面兩個(gè)的父集蜈彼;
另一種則是代表一種編碼)
UTF-8:Unicode的編碼分支
UTF-16:Unicode的編碼分支
簡單來說就是補(bǔ)位的方式不同
GBK/GB2312.GB18030:中國自研標(biāo)準(zhǔn),多字節(jié)俺驶,字符集+編碼(已經(jīng)隱退)