進製數零一
二三四五
六七**
十十一十二十三
十四十五十六…
十進位制012
3456
78910
111213…
二進位制0110
11100
101110
111…
十六進製制01
2345
6789
abcd
ef10…
計算機的儲存單位為位元組,乙個位元組對應8個二進位制位,共可以表示2^8也就是256種狀態。若表示數的話,最多只能表示256個數。
如乙個位元組可以表示非負整數的0~255,而表示更大的數,則需要占用多個位元組,如表示256至少需要兩個位元組。
256的二進位制形式為0000000100000000。這樣在計算機儲存上就存在乙個問題:是先儲存00000001這個位元組,還是先儲存00000000這個位元組呢?實際上,採用這兩種儲存方式的都有,取決於cpu架構和編譯器。這就引出了位元組序的概念。
小端位元組序(little endian):低位位元組存放在低記憶體位址,高位位元組存放在高記憶體位址端。256作為無符號數在計算機記憶體中的儲存:大端位元組序(big endian):高位位元組存放在低記憶體位址,低位位元組存放在高記憶體位址端。
位元組序低位址 ————> 高位址
小端0000000000000001
大端0000000100000000
接下來這篇文章的所有關於儲存的描述都是基於小端位元組序的,記憶體位址都是從左往右從低到高的,而且帶[儲存]字樣。(這很關鍵)
如:0000000100000010 [儲存] 表示的是十六進製制的0x201,十進位制的513,二進位制的1000000001b
(乙個數以0x開頭意味著這個數是採用的十六進製制,以b結尾意味著採用二進位制)
0110100001100101011011000110110001101111[儲存]md5演算法就像乙個函式,任意乙個二進位制串都可以作為自變數進入這個「函式」,然後會出來乙個固定為128位的二進位制串。(這和utf-8編碼的字串」hello」,在記憶體中的儲存是一樣的。)
0110100001100101011011000110110001101111[儲存]進行二進位制位補充。具體這樣補充:
從這40位的後面開始,先補充乙個1位,再補充0位,一直到總共448位長度(也就是補充407個0位)。接著在後面寫入原始首席資訊官度與2^64的模。也就是40mod(2^64)=40,40轉化為2進製為101000,用64儲存就是:
0010100000000000000000000000000000000000000000000000000000000000 [儲存]二進位制位補充完成。
得到內容(共512位):
01101000011001010110110001101100011011111 (407個0)0010100000000000000000000000000000000000000000000000000000000000 [儲存]然後對這個512個位平均分成16組,每組32個位:
第1組:01101000011001010110110001101100然後使用四個常數進行運算,分別是:第2組:01101111100000000000000000000000
… 第32組:00000000000000000000000000000000
a=0x67452301,b=0xefcdab89,c=0x98badcfe,d=0x10325476。
a:00000001001000110100010101100111 [儲存]
b:10001001101010111100110111101111 [儲存]
c:11111110110111001011101010011000 [儲存]
d:01110110010101000011001000010000 [儲存]
一共進行64輪運算:
先說明運算子:=賦值運算子: i=0意味著把0賦值給i,也就是讓i的值為0
&按位與運算子:1010b & 1100b的值為1000b
or按位或運算子:1010b or 1100b的值為1110b
^按位異或運算子:1010b ^ 1100b的值為0110b
~按位取反運算子:~1010b的值為0101b
《按位迴圈左移運算子:1100b << 3的值為0110b
mod是取模運算子:33 mod 16 的值為1
i==64是判斷i是否和64相等
以上計算由乙個地方需要說明,就是給t賦值計算的時候,不考慮進製,每個數都是由32位二進位制串表示,加的時候若有進製則進製丟失,得到的t也用32位二進位制串表示。
以上數還有兩個沒有提到,k[i]和s[i]:
s[i]取值為以下陣列的第i+1個數
如s[0]==7,s[3]=22...
k[i]取值為以下陣列的第i+1個數
進行完這些運算後,a,b,c,d的值都獲得了更新
a:******xx******xx******xx******xx [儲存]
b:******xx******xx******xx******xx [儲存]
c:******xx******xx******xx******xx [儲存]
d:******xx******xx******xx******xx [儲存]
把這四個數a -> b -> c -> d按照從低記憶體到高記憶體排列起來,共128位,這就是md5演算法的輸出。
hash演算法原理之md5過程
進製數零一 二三四五 六七 十十一十二十三 十四十五十六 十進位制012 3456 78910 111213 二進位制0110 11100 101110 111 十六進製制01 2345 6789 abcd ef10 計算機的儲存單位為位元組,乙個位元組對應8個二進位制位,共可以表示2 8也就是25...
MD5演算法原理
訊息摘要 將任意長度的字元陣列處理成定長的字元陣列,用於確保原字串不被修改,也可以用做密碼確認,如果密碼一致,則md5產生後的值必然一致,否則不相同 public class datautil string src 唐 stringbuffer sb new stringbuffer byte b1...
MD5值演算法原理
md5 原理說明 一 md5 演算法介紹。md5,即 message digest algorithm 5 資訊 摘要演算法 從名字來看就知道它是從md3 md4發展而來的一種加密演算法,其主要通過採集檔案的資訊摘要,以此進行計算並加密。通過md5演算法進行加密,檔案就可以獲得乙個唯一的md5值,這...