code: private void Update (MD5State stat, byte[] buffer, int offset, int length) {
  		int	index, partlen, i, start;
  
  		finals = null;
  
  		/* Length can be told to be shorter, but not inter */
  		if ((length - offset)> buffer.length)
  			length = buffer.length - offset;
  
  		/* compute number of bytes mod 64 */
  		index = (stat.count[0] >>> 3) & 0x3f;
  
  		if ((stat.count[0] += (length << 3)) <
  			(length << 3))
  				stat.count[1]++;
  
  		stat.count[1] += length >>> 29;
  
  		partlen = 64 - index;
  
  		if (length >= partlen) {
  			for (i = 0; i < partlen; i++)
  				stat.buffer[i + index] = buffer[i + offset];
  
  			Transform(stat, stat.buffer, 0);
  
  			for (i = partlen; (i + 63) < length; i+= 64)
  				Transform(stat, buffer, i);
  
  			index = 0;
  		} else 
  			i = 0;
  
  		/* buffer remaining input */
  		if (i < length) {
  			start = i;
  			for (; i < length; i++) 
  				stat.buffer[index + i - start] = buffer[i + offset];
  		}
  	}
docs: Updates hash with the bytebuffer given (using at maximum length bytes from
  that buffer)
  
  @param stat	Which state is updated
  @param buffer	Array of bytes to be hashed
  @param offset	Offset to buffer array
  @param length	Use at maximum `length' bytes (absolute
  maximum is buffer.length)