//Note: All variables are unsigned 32 bits and wrap modulo 2^32 when calculatingvarint[64]r,k//r specifies the per-round shift amountsr[0..15]:={7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22}r[16..31]:={5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20}r[32..47]:={4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23}r[48..63]:={6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21}//Use binary integer part of the sines of integers as constants:forifrom0to63k[i]:=floor(abs(sin(i+1))×2^32)//Initialize variables:varinth0:=0x67452301varinth1:=0xEFCDAB89varinth2:=0x98BADCFEvarinth3:=0x10325476//Pre-processing:append"1"bittomessageappend"0"bitsuntilmessagelengthinbits≡448(mod512)appendbitlengthofmessageas64-bitlittle-endianintegertomessage//Process the message in successive 512-bit chunks:foreach512-bitchunkofmessagebreakchunkintosixteen32-bitlittle-endianwordsw[i],0≤i≤15//Initialize hash value for this chunk:varinta:=h0varintb:=h1varintc:=h2varintd:=h3//Main loop:forifrom0to63if0≤i≤15thenf:=(bandc)or((notb)andd)g:=ielseif16≤i≤31f:=(dandb)or((notd)andc)g:=(5×i+1)mod16elseif32≤i≤47f:=bxorcxordg:=(3×i+5)mod16elseif48≤i≤63f:=cxor(bor(notd))g:=(7×i)mod16temp:=dd:=cc:=bb:=leftrotate((a+f+k[i]+w[g]),r[i])+ba:=tempNexti//Add this chunk's hash to result so far:h0:=h0+ah1:=h1+bh2:=h2+ch3:=h3+dEndForEachvarintdigest:=h0appendh1appendh2appendh3//(expressed as little-endian)