📄 md5.java
字号:
d = ((d << 11) | (d >>> 21)) + a; c += (d ^ a ^ b) + x[ 7] + 0xf6bb4b60; /* 39 */ c = ((c << 16) | (c >>> 16)) + d; b += (c ^ d ^ a) + x[10] + 0xbebfbc70; /* 40 */ b = ((b << 23) | (b >>> 9)) + c; a += (b ^ c ^ d) + x[13] + 0x289b7ec6; /* 41 */ a = ((a << 4) | (a >>> 28)) + b; d += (a ^ b ^ c) + x[ 0] + 0xeaa127fa; /* 42 */ d = ((d << 11) | (d >>> 21)) + a; c += (d ^ a ^ b) + x[ 3] + 0xd4ef3085; /* 43 */ c = ((c << 16) | (c >>> 16)) + d; b += (c ^ d ^ a) + x[ 6] + 0x04881d05; /* 44 */ b = ((b << 23) | (b >>> 9)) + c; a += (b ^ c ^ d) + x[ 9] + 0xd9d4d039; /* 33 */ a = ((a << 4) | (a >>> 28)) + b; d += (a ^ b ^ c) + x[12] + 0xe6db99e5; /* 34 */ d = ((d << 11) | (d >>> 21)) + a; c += (d ^ a ^ b) + x[15] + 0x1fa27cf8; /* 35 */ c = ((c << 16) | (c >>> 16)) + d; b += (c ^ d ^ a) + x[ 2] + 0xc4ac5665; /* 36 */ b = ((b << 23) | (b >>> 9)) + c; /* Round 4 */ a += (c ^ (b | ~d)) + x[ 0] + 0xf4292244; /* 49 */ a = ((a << 6) | (a >>> 26)) + b; d += (b ^ (a | ~c)) + x[ 7] + 0x432aff97; /* 50 */ d = ((d << 10) | (d >>> 22)) + a; c += (a ^ (d | ~b)) + x[14] + 0xab9423a7; /* 51 */ c = ((c << 15) | (c >>> 17)) + d; b += (d ^ (c | ~a)) + x[ 5] + 0xfc93a039; /* 52 */ b = ((b << 21) | (b >>> 11)) + c; a += (c ^ (b | ~d)) + x[12] + 0x655b59c3; /* 53 */ a = ((a << 6) | (a >>> 26)) + b; d += (b ^ (a | ~c)) + x[ 3] + 0x8f0ccc92; /* 54 */ d = ((d << 10) | (d >>> 22)) + a; c += (a ^ (d | ~b)) + x[10] + 0xffeff47d; /* 55 */ c = ((c << 15) | (c >>> 17)) + d; b += (d ^ (c | ~a)) + x[ 1] + 0x85845dd1; /* 56 */ b = ((b << 21) | (b >>> 11)) + c; a += (c ^ (b | ~d)) + x[ 8] + 0x6fa87e4f; /* 57 */ a = ((a << 6) | (a >>> 26)) + b; d += (b ^ (a | ~c)) + x[15] + 0xfe2ce6e0; /* 58 */ d = ((d << 10) | (d >>> 22)) + a; c += (a ^ (d | ~b)) + x[ 6] + 0xa3014314; /* 59 */ c = ((c << 15) | (c >>> 17)) + d; b += (d ^ (c | ~a)) + x[13] + 0x4e0811a1; /* 60 */ b = ((b << 21) | (b >>> 11)) + c; a += (c ^ (b | ~d)) + x[ 4] + 0xf7537e82; /* 61 */ a = ((a << 6) | (a >>> 26)) + b; d += (b ^ (a | ~c)) + x[11] + 0xbd3af235; /* 62 */ d = ((d << 10) | (d >>> 22)) + a; c += (a ^ (d | ~b)) + x[ 2] + 0x2ad7d2bb; /* 63 */ c = ((c << 15) | (c >>> 17)) + d; b += (d ^ (c | ~a)) + x[ 9] + 0xeb86d391; /* 64 */ b = ((b << 21) | (b >>> 11)) + c; state.state[0] += a; state.state[1] += b; state.state[2] += c; state.state[3] += d; } /** * 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) */ public 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 = (int) (stat.count & 0x3f); stat.count += length; partlen = 64 - index; if (length >= partlen) { // update state (using only Java) to reflect input int[] decode_buf = new int[16]; if (partlen == 64) { partlen = 0; } else { for (i = 0; i < partlen; i++) stat.buffer[i + index] = buffer[i + offset]; Transform(stat, stat.buffer, 0, decode_buf); } for (i = partlen; (i + 63) < length; i+= 64) { Transform(stat, buffer, i + offset, decode_buf); } 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]; } } } /* * Update()s for other datatypes than byte[] also. Update(byte[], int) * is only the main driver. */ /** * Plain update, updates this object */ public void Update (byte buffer[], int offset, int length) { Update(this.state, buffer, offset, length); } public void Update (byte buffer[], int length) { Update(this.state, buffer, 0, length); } /** * Updates hash with given array of bytes * * @param buffer Array of bytes to use for updating the hash */ public void Update (byte buffer[]) { Update(buffer, 0, buffer.length); } /** * Updates hash with a single byte * * @param b Single byte to update the hash */ public void Update (byte b) { byte buffer[] = new byte[1]; buffer[0] = b; Update(buffer, 1); } /** * Update buffer with given string. Note that because the version of * the s.getBytes() method without parameters is used to convert the * string to a byte array, the results of this method may be different * on different platforms. The s.getBytes() method converts the string * into a byte array using the current platform's default character set * and may therefore have different results on platforms with different * default character sets. If a version that works consistently * across platforms with different default character sets is desired, * use the overloaded version of the Update() method which takes a * string and a character encoding. * * @param s String to be update to hash (is used as * s.getBytes()) */ public void Update (String s) { byte chars[] = s.getBytes(); Update(chars, chars.length); } /** * Update buffer with given string using the given encoding. If the * given encoding is null, the encoding "ISO8859_1" is used. * * @param s String to be update to hash (is used as * s.getBytes(charset_name)) * @param charset_name The character set to use to convert s to a * byte array, or null if the "ISO8859_1" * character set is desired. * @exception java.io.UnsupportedEncodingException If the named * charset is not supported. */ public void Update (String s, String charset_name) throws java.io.UnsupportedEncodingException { if (charset_name == null) charset_name = "ISO8859_1"; byte chars[] = s.getBytes(charset_name); Update(chars, chars.length); } /** * Update buffer with a single integer (only & 0xff part is used, * as a byte) * * @param i Integer value, which is then converted to * byte as i & 0xff */ public void Update (int i) { Update((byte) (i & 0xff)); } private byte[] Encode (int input[], int len) { int i, j; byte out[]; out = new byte[len]; for (i = j = 0; j < len; i++, j += 4) { out[j] = (byte) (input[i] & 0xff); out[j + 1] = (byte) ((input[i] >>> 8) & 0xff); out[j + 2] = (byte) ((input[i] >>> 16) & 0xff); out[j + 3] = (byte) ((input[i] >>> 24) & 0xff); } return out; } /** * 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 */ public synchronized byte[] Final () { byte bits[]; int index, padlen; MD5State fin; if (finals == null) { fin = new MD5State(state); int[] count_ints = {(int) (fin.count << 3), (int) (fin.count >> 29)}; bits = Encode(count_ints, 8); index = (int) (fin.count & 0x3f); padlen = (index < 56) ? (56 - index) : (120 - index); Update(fin, padding, 0, padlen); Update(fin, bits, 0, 8); /* Update() sets finals to null */ finals = fin; } return Encode(finals.state, 16); } public static byte[] toHash(byte[] data){ MD5 md5 = new MD5(); md5.Update(data); return md5.Final(); } private static final char[] HEX_CHARS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',}; /** * Turns array of bytes into string representing each byte as * unsigned hex number. * * @param hash Array of bytes to convert to hex-string * @return Generated hex string */ public static String asHex (byte hash[]) { char buf[] = new char[hash.length * 2]; for (int i = 0, x = 0; i < hash.length; i++) { buf[x++] = HEX_CHARS[(hash[i] >>> 4) & 0xf]; buf[x++] = HEX_CHARS[hash[i] & 0xf]; } return new String(buf); } /** * Returns 32-character hex representation of this objects hash * * @return String of this object's hash */ public String asHex () { return asHex(this.Final()); } /** * @return true iff the first 16 bytes of both hash1 and hash2 are * equal; both hash1 and hash2 are null; or either hash * array is less than 16 bytes in length and their lengths and * all of their bytes are equal. **/ public static boolean hashesEqual(byte[] hash1, byte[] hash2) { if (hash1 == null) return hash2 == null; if (hash2 == null) return false; int targ = 16; if (hash1.length < 16) { if (hash2.length != hash1.length) return false; targ = hash1.length; } else if (hash2.length < 16) { return false; } for (int i = 0; i < targ; i++) { if (hash1[i] != hash2[i]) return false; } return true; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -