public static byte[] GetHash(byte[] input) { if (null == input) { throw new System.ArgumentNullException("input", "Unable to calculate hash over null input data"); } //Intitial values defined in RFC 1321 ABCDStruct abcd = new ABCDStruct(); abcd.A = 0x67452301; abcd.B = 0xefcdab89; abcd.C = 0x98badcfe; abcd.D = 0x10325476; //We pass in the input array by block, the final block of data must be handled specialy for padding & length embeding int startIndex = 0; while (startIndex <= input.Length - 64) { MD5Core.GetHashBlock(input, ref abcd, startIndex); startIndex += 64; } // The final data block. return(MD5Core.GetHashFinalBlock(input, startIndex, input.Length - startIndex, abcd, (Int64)input.Length * 8)); }
protected override void HashCore(byte[] array, int ibStart, int cbSize) { int startIndex = ibStart; int totalArrayLength = _dataSize + cbSize; if (totalArrayLength >= 64) { Array.Copy(array, startIndex, _data, _dataSize, 64 - _dataSize); // Process message of 64 bytes (512 bits) MD5Core.GetHashBlock(_data, ref _abcd, 0); startIndex += 64 - _dataSize; totalArrayLength -= 64; while (totalArrayLength >= 64) { Array.Copy(array, startIndex, _data, 0, 64); MD5Core.GetHashBlock(array, ref _abcd, startIndex); totalArrayLength -= 64; startIndex += 64; } _dataSize = totalArrayLength; Array.Copy(array, startIndex, _data, 0, totalArrayLength); } else { Array.Copy(array, startIndex, _data, _dataSize, cbSize); _dataSize = totalArrayLength; } _totalLength += cbSize; }
/// <summary> /// 获取指定字节流的MD5值(HEX编码) /// </summary> /// <param name="data"></param> /// <returns></returns> public static byte[] get_md5_bytes(byte[] data) { byte[] bytes_md5_out = MD5Core.GetHash(data); return(bytes_md5_out); }
/// <summary> /// 获取字符串的MD5值(字节流) /// </summary> /// <param name="str">输入的字符串</param> /// <returns></returns> public static byte[] get_md5_bytes(string str) { byte[] bytes_md5_out = MD5Core.GetHash(str); return(bytes_md5_out); }
/// <summary> /// 获取指定字节流的MD5值(HEX编码) /// </summary> /// <param name="data"></param> /// <returns></returns> public static string get_md5_string(byte[] data) { byte[] bytes_md5_out = MD5Core.GetHash(data); return(ByteHelper.Bytes2HexString(bytes_md5_out)); }
protected override byte[] HashFinal() { base.HashValue = MD5Core.GetHashFinalBlock(_data, 0, _dataSize, _abcd, _totalLength * 8); return(base.HashValue); }