You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

190 lines
4.9 KiB

  1. using Apewer;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. namespace Apewer.Internals
  8. {
  9. internal class HashHelper
  10. {
  11. /// <summary>获取 MD5 值。</summary>
  12. public static byte[] MD5(params byte[] argBytes)
  13. {
  14. var result = Constant.EmptyBytes;
  15. try
  16. {
  17. var csp = new MD5CryptoServiceProvider();
  18. result = csp.ComputeHash(argBytes);
  19. csp.Clear();
  20. #if !NET20
  21. csp.Dispose();
  22. #endif
  23. }
  24. finally { }
  25. return result;
  26. }
  27. /// <summary>获取 MD5 值。</summary>
  28. public static byte[] MD5(Stream argStream)
  29. {
  30. var result = Constant.EmptyBytes;
  31. try
  32. {
  33. var csp = new MD5CryptoServiceProvider();
  34. result = csp.ComputeHash(argStream);
  35. csp.Clear();
  36. #if !NET20
  37. csp.Dispose();
  38. #endif
  39. }
  40. finally { }
  41. return result;
  42. }
  43. /// <summary>获取 MD5 值。</summary>
  44. public static byte[] MD5(Stream argStream, Action<Int64> argProgressed, object argSender)
  45. {
  46. var origin = argStream;
  47. var validtotal = true;
  48. // 总长度。
  49. var total = 0L;
  50. try { total = origin.Length; } catch { validtotal = false; }
  51. if (origin.Length <= 0) validtotal = false;
  52. if (validtotal == false) return Constant.EmptyBytes;
  53. // 初始化。
  54. var validcallback = argProgressed != null;
  55. var capacity = (long)Constant.DefaultBufferCapacity;
  56. var buffer = new byte[capacity];
  57. var md5 = new MD5CryptoServiceProvider();
  58. md5.Initialize();
  59. // 读取。
  60. var offset = 0L;
  61. var failed = false;
  62. var final = false;
  63. while (offset < origin.Length)
  64. {
  65. var current = capacity;
  66. if (offset + current > total)
  67. {
  68. current = total - offset;
  69. final = true;
  70. }
  71. try
  72. {
  73. origin.Read(buffer, 0, Convert.ToInt32(current));
  74. }
  75. catch
  76. {
  77. failed = true;
  78. break;
  79. }
  80. if (final)
  81. {
  82. md5.TransformFinalBlock(buffer, 0, Convert.ToInt32(current));
  83. }
  84. else
  85. {
  86. md5.TransformBlock(buffer, 0, Convert.ToInt32(current), buffer, 0);
  87. }
  88. offset += capacity;
  89. }
  90. if (failed)
  91. {
  92. md5.Clear();
  93. #if !NET20
  94. md5.Dispose();
  95. #endif
  96. return Constant.EmptyBytes;
  97. }
  98. else
  99. {
  100. var result = md5.Hash;
  101. md5.Clear();
  102. #if !NET20
  103. md5.Dispose();
  104. #endif
  105. return result;
  106. }
  107. }
  108. /// <summary>获取 SHA1 值。</summary>
  109. public static byte[] SHA1(params byte[] argBytes)
  110. {
  111. var result = Constant.EmptyBytes;
  112. try
  113. {
  114. var csp = new SHA1CryptoServiceProvider();
  115. result = csp.ComputeHash(argBytes);
  116. csp.Clear();
  117. #if !NET20
  118. csp.Dispose();
  119. #endif
  120. }
  121. finally { }
  122. return result;
  123. }
  124. /// <summary>获取 SHA1 值。</summary>
  125. public static byte[] SHA1(Stream argStream)
  126. {
  127. var result = Constant.EmptyBytes;
  128. try
  129. {
  130. var csp = new SHA1CryptoServiceProvider();
  131. result = csp.ComputeHash(argStream);
  132. csp.Clear();
  133. #if !NET20
  134. csp.Dispose();
  135. #endif
  136. }
  137. finally { }
  138. return result;
  139. }
  140. #if !NET20
  141. /// <summary>获取 SHA256 值。</summary>
  142. public static byte[] SHA256(params byte[] argBytes)
  143. {
  144. var result = Constant.EmptyBytes;
  145. try
  146. {
  147. var csp = new SHA256CryptoServiceProvider();
  148. result = csp.ComputeHash(argBytes);
  149. csp.Clear();
  150. csp.Dispose();
  151. }
  152. finally { }
  153. return result;
  154. }
  155. /// <summary>获取 SHA256 值。</summary>
  156. public static byte[] SHA256(Stream argStream)
  157. {
  158. var result = Constant.EmptyBytes;
  159. try
  160. {
  161. var csp = new SHA256CryptoServiceProvider();
  162. result = csp.ComputeHash(argStream);
  163. csp.Clear();
  164. csp.Dispose();
  165. }
  166. finally { }
  167. return result;
  168. }
  169. #endif
  170. }
  171. }