Kaynağa Gözat

修正文件md5计算的bug

懒得勤快 6 yıl önce
ebeveyn
işleme
d4c964f1f0

+ 18 - 95
Masuit.Tools.Core/Files/FileExt.cs

@@ -1,5 +1,6 @@
-using System;
-using System.IO;
+using System.IO;
+using System.Security.Cryptography;
+using System.Text;
 using System.Threading.Tasks;
 
 namespace Masuit.Tools.Files
@@ -76,13 +77,6 @@ namespace Masuit.Tools.Files
         /// <returns>MD5 值16进制字符串</returns>
         public static string GetFileMD5(this FileStream fs) => HashFile(fs, "md5");
 
-        /// <summary>
-        /// 计算文件的 MD5 值
-        /// </summary>
-        /// <param name="fs">源文件流</param>
-        /// <returns>MD5 值16进制字符串</returns>
-        public static Task<string> GetFileMD5Async(this FileStream fs) => HashFileAsync(fs, "md5");
-
         /// <summary>
         /// 计算文件的 sha1 值
         /// </summary>
@@ -90,102 +84,31 @@ namespace Masuit.Tools.Files
         /// <returns>sha1 值16进制字符串</returns>
         public static string GetFileSha1(this Stream fs) => HashFile(fs, "sha1");
 
-        /// <summary>
-        /// 计算文件的 sha1 值
-        /// </summary>
-        /// <param name="fs">源文件流</param>
-        /// <returns>sha1 值16进制字符串</returns>
-        public static Task<string> GetFileSha1Async(this FileStream fs) => HashFileAsync(fs, "sha1");
-
-        /// <summary>
-        /// 计算文件的哈希值
-        /// </summary>
-        /// <param name="fs">被操作的源数据流</param>
-        /// <param name="algName">算法:sha1,md5</param>
-        /// <returns>哈希值16进制字符串</returns>
-        private static string HashFile(Stream fs, string algName)
-        {
-            byte[] hashBytes = HashData(fs, algName);
-            return ByteArrayToHexString(hashBytes);
-        }
-
         /// <summary>
         /// 计算文件的哈希值
         /// </summary>
         /// <param name="fs">被操作的源数据流</param>
-        /// <param name="algName">算法:sha1,md5</param>
+        /// <param name="algo">加密算法</param>
         /// <returns>哈希值16进制字符串</returns>
-        private static async Task<string> HashFileAsync(Stream fs, string algName)
+        private static string HashFile(Stream fs, string algo)
         {
-            byte[] hashBytes = await HashDataAsync(fs, algName).ConfigureAwait(false);
-            return ByteArrayToHexString(hashBytes);
-        }
-
-        /// <summary>
-        /// 计算哈希值
-        /// </summary>
-        /// <param name="stream">要计算哈希值的 Stream</param>
-        /// <param name="algName">算法:sha1,md5</param>
-        /// <returns>哈希值字节数组</returns>
-        private static byte[] HashData(System.IO.Stream stream, string algName)
-        {
-            System.Security.Cryptography.HashAlgorithm algorithm;
-            if (algName == null)
+            HashAlgorithm crypto;
+            switch (algo)
             {
-                throw new ArgumentNullException("algName 不能为 null");
+                case "sha1":
+                    crypto = new SHA1CryptoServiceProvider();
+                    break;
+                default:
+                    crypto = new MD5CryptoServiceProvider();
+                    break;
             }
-
-            if (string.Compare(algName, "sha1", true) == 0)
+            byte[] retVal = crypto.ComputeHash(fs);
+            StringBuilder sb = new StringBuilder();
+            foreach (var t in retVal)
             {
-                algorithm = System.Security.Cryptography.SHA1.Create();
+                sb.Append(t.ToString("x2"));
             }
-            else
-            {
-                if (string.Compare(algName, "md5", true) != 0)
-                {
-                    throw new Exception("algName 只能使用 sha1 或 md5");
-                }
-
-                algorithm = System.Security.Cryptography.MD5.Create();
-            }
-
-            return algorithm.ComputeHash(stream);
+            return sb.ToString();
         }
-
-        /// <summary>
-        /// 计算哈希值
-        /// </summary>
-        /// <param name="stream">要计算哈希值的 Stream</param>
-        /// <param name="algName">算法:sha1,md5</param>
-        /// <returns>哈希值字节数组</returns>
-        private static async Task<byte[]> HashDataAsync(this Stream stream, string algName)
-        {
-            System.Security.Cryptography.HashAlgorithm algorithm;
-            if (algName == null)
-            {
-                throw new ArgumentNullException("algName 不能为 null");
-            }
-
-            if (string.Compare(algName, "sha1", true) == 0)
-            {
-                algorithm = System.Security.Cryptography.SHA1.Create();
-            }
-            else
-            {
-                if (string.Compare(algName, "md5", true) != 0)
-                {
-                    throw new Exception("algName 只能使用 sha1 或 md5");
-                }
-
-                algorithm = System.Security.Cryptography.MD5.Create();
-            }
-
-            return await Task.Run(() => algorithm.ComputeHash(stream)).ConfigureAwait(false);
-        }
-
-        /// <summary>
-        /// 字节数组转换为16进制表示的字符串
-        /// </summary>
-        private static string ByteArrayToHexString(byte[] buf) => BitConverter.ToString(buf).Replace("-", "");
     }
 }

+ 1 - 1
Masuit.Tools.ExpressionMapperBenchmark/Masuit.Tools.ExpressionMapperBenchmark.csproj

@@ -6,7 +6,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="AutoMapper" Version="8.0.0" />
+    <PackageReference Include="AutoMapper" Version="8.1.0" />
   </ItemGroup>
 
   <ItemGroup>

+ 18 - 95
Masuit.Tools/Files/FileExt.cs

@@ -1,5 +1,6 @@
-using System;
-using System.IO;
+using System.IO;
+using System.Security.Cryptography;
+using System.Text;
 using System.Threading.Tasks;
 
 namespace Masuit.Tools.Files
@@ -76,13 +77,6 @@ namespace Masuit.Tools.Files
         /// <returns>MD5 值16进制字符串</returns>
         public static string GetFileMD5(this FileStream fs) => HashFile(fs, "md5");
 
-        /// <summary>
-        /// 计算文件的 MD5 值
-        /// </summary>
-        /// <param name="fs">源文件流</param>
-        /// <returns>MD5 值16进制字符串</returns>
-        public static Task<string> GetFileMD5Async(this FileStream fs) => HashFileAsync(fs, "md5");
-
         /// <summary>
         /// 计算文件的 sha1 值
         /// </summary>
@@ -90,102 +84,31 @@ namespace Masuit.Tools.Files
         /// <returns>sha1 值16进制字符串</returns>
         public static string GetFileSha1(this Stream fs) => HashFile(fs, "sha1");
 
-        /// <summary>
-        /// 计算文件的 sha1 值
-        /// </summary>
-        /// <param name="fs">源文件流</param>
-        /// <returns>sha1 值16进制字符串</returns>
-        public static Task<string> GetFileSha1Async(this FileStream fs) => HashFileAsync(fs, "sha1");
-
-        /// <summary>
-        /// 计算文件的哈希值
-        /// </summary>
-        /// <param name="fs">被操作的源数据流</param>
-        /// <param name="algName">算法:sha1,md5</param>
-        /// <returns>哈希值16进制字符串</returns>
-        private static string HashFile(Stream fs, string algName)
-        {
-            byte[] hashBytes = HashData(fs, algName);
-            return ByteArrayToHexString(hashBytes);
-        }
-
         /// <summary>
         /// 计算文件的哈希值
         /// </summary>
         /// <param name="fs">被操作的源数据流</param>
-        /// <param name="algName">算法:sha1,md5</param>
+        /// <param name="algo">加密算法</param>
         /// <returns>哈希值16进制字符串</returns>
-        private static async Task<string> HashFileAsync(Stream fs, string algName)
+        private static string HashFile(Stream fs, string algo)
         {
-            byte[] hashBytes = await HashDataAsync(fs, algName).ConfigureAwait(false);
-            return ByteArrayToHexString(hashBytes);
-        }
-
-        /// <summary>
-        /// 计算哈希值
-        /// </summary>
-        /// <param name="stream">要计算哈希值的 Stream</param>
-        /// <param name="algName">算法:sha1,md5</param>
-        /// <returns>哈希值字节数组</returns>
-        private static byte[] HashData(System.IO.Stream stream, string algName)
-        {
-            System.Security.Cryptography.HashAlgorithm algorithm;
-            if (algName == null)
+            HashAlgorithm crypto;
+            switch (algo)
             {
-                throw new ArgumentNullException("algName 不能为 null");
+                case "sha1":
+                    crypto = new SHA1CryptoServiceProvider();
+                    break;
+                default:
+                    crypto = new MD5CryptoServiceProvider();
+                    break;
             }
-
-            if (string.Compare(algName, "sha1", true) == 0)
+            byte[] retVal = crypto.ComputeHash(fs);
+            StringBuilder sb = new StringBuilder();
+            foreach (var t in retVal)
             {
-                algorithm = System.Security.Cryptography.SHA1.Create();
+                sb.Append(t.ToString("x2"));
             }
-            else
-            {
-                if (string.Compare(algName, "md5", true) != 0)
-                {
-                    throw new Exception("algName 只能使用 sha1 或 md5");
-                }
-
-                algorithm = System.Security.Cryptography.MD5.Create();
-            }
-
-            return algorithm.ComputeHash(stream);
+            return sb.ToString();
         }
-
-        /// <summary>
-        /// 计算哈希值
-        /// </summary>
-        /// <param name="stream">要计算哈希值的 Stream</param>
-        /// <param name="algName">算法:sha1,md5</param>
-        /// <returns>哈希值字节数组</returns>
-        private static async Task<byte[]> HashDataAsync(this Stream stream, string algName)
-        {
-            System.Security.Cryptography.HashAlgorithm algorithm;
-            if (algName == null)
-            {
-                throw new ArgumentNullException("algName 不能为 null");
-            }
-
-            if (string.Compare(algName, "sha1", true) == 0)
-            {
-                algorithm = System.Security.Cryptography.SHA1.Create();
-            }
-            else
-            {
-                if (string.Compare(algName, "md5", true) != 0)
-                {
-                    throw new Exception("algName 只能使用 sha1 或 md5");
-                }
-
-                algorithm = System.Security.Cryptography.MD5.Create();
-            }
-
-            return await Task.Run(() => algorithm.ComputeHash(stream)).ConfigureAwait(false);
-        }
-
-        /// <summary>
-        /// 字节数组转换为16进制表示的字符串
-        /// </summary>
-        private static string ByteArrayToHexString(byte[] buf) => BitConverter.ToString(buf).Replace("-", "");
     }
 }

+ 0 - 3
Masuit.Tools/Masuit.Tools.csproj

@@ -50,9 +50,6 @@
     <Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
     </Reference>
-    <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
-      <HintPath>..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
-    </Reference>
     <Reference Include="SharpCompress, Version=0.23.0.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL">
       <HintPath>..\packages\SharpCompress.0.23.0\lib\net45\SharpCompress.dll</HintPath>
     </Reference>

+ 1 - 1
Masuit.Tools/packages.config

@@ -6,7 +6,7 @@
   <package id="Microsoft.AspNet.Razor" version="3.2.7" targetFramework="net45" />
   <package id="Microsoft.AspNet.WebPages" version="3.2.7" targetFramework="net45" />
   <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
-  <package id="Newtonsoft.Json" version="12.0.1" targetFramework="net45" />
+  <package id="Newtonsoft.Json" version="12.0.2" targetFramework="net45" />
   <package id="SharpCompress" version="0.23.0" targetFramework="net45" />
   <package id="StackExchange.Redis" version="1.2.6" targetFramework="net45" />
 </packages>