code: public synchronized byte[] Final () {
  		byte[]	bits;
  		int		index, padlen;
  		MD5State	fin;
  
  		if (finals == null) {
  			fin = new MD5State(state);
  
  			bits = Encode(fin.count, 8);
  
  			index = (fin.count[0] >>> 3) & 0x3f;
  			padlen = (index < 56) ? (56 - index) : (120 - index);
  
  			Update(fin, padding, 0, padlen);
  			/**/
  			Update(fin, bits, 0, 8);	
  
  			/* Update() sets finalds to null */
  			finals = fin;
  		}
  
  		return Encode(finals.state, 16);
  	}
docs: Returns array of bytes (16 bytes) representing hash as of the
  current state of this object. Note: getting a hash does not
  invalidate the hash object, it only creates a copy of the real
  state which is finalized.
  
  @return	Array of 16 bytes, the hash of all updated bytes