YooAsset/Assets/YooAsset/Runtime/Utility/HashUtility.cs

169 lines
3.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Text;
using System.IO;
using System.Security.Cryptography;
namespace YooAsset.Utility
{
public static class HashUtility
{
private static string ToString(byte[] hashBytes)
{
string result = BitConverter.ToString(hashBytes);
result = result.Replace("-", "");
return result.ToLower();
}
#region SHA1
/// <summary>
/// 获取字符串的Hash值
/// </summary>
public static string StringSHA1(string str)
{
byte[] buffer = Encoding.UTF8.GetBytes(str);
return BytesSHA1(buffer);
}
/// <summary>
/// 获取文件的Hash值
/// </summary>
public static string FileSHA1(string filePath)
{
try
{
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
return StreamSHA1(fs);
}
}
catch (Exception e)
{
Logger.Exception(e);
return string.Empty;
}
}
/// <summary>
/// 获取数据流的Hash值
/// </summary>
public static string StreamSHA1(Stream stream)
{
// 说明创建的是SHA1类的实例生成的是160位的散列码
HashAlgorithm hash = HashAlgorithm.Create();
byte[] hashBytes = hash.ComputeHash(stream);
return ToString(hashBytes);
}
/// <summary>
/// 获取字节数组的Hash值
/// </summary>
public static string BytesSHA1(byte[] buffer)
{
// 说明创建的是SHA1类的实例生成的是160位的散列码
HashAlgorithm hash = HashAlgorithm.Create();
byte[] hashBytes = hash.ComputeHash(buffer);
return ToString(hashBytes);
}
#endregion
#region MD5
/// <summary>
/// 获取字符串的MD5
/// </summary>
public static string StringMD5(string str)
{
byte[] buffer = Encoding.UTF8.GetBytes(str);
return BytesMD5(buffer);
}
/// <summary>
/// 获取文件的MD5
/// </summary>
public static string FileMD5(string filePath)
{
try
{
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
return StreamMD5(fs);
}
}
catch (Exception e)
{
Logger.Exception(e);
return string.Empty;
}
}
/// <summary>
/// 获取数据流的MD5
/// </summary>
public static string StreamMD5(Stream stream)
{
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
byte[] hashBytes = provider.ComputeHash(stream);
return ToString(hashBytes);
}
/// <summary>
/// 获取字节数组的MD5
/// </summary>
public static string BytesMD5(byte[] buffer)
{
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
byte[] hashBytes = provider.ComputeHash(buffer);
return ToString(hashBytes);
}
#endregion
#region CRC32
/// <summary>
/// 获取字符串的CRC32
/// </summary>
public static string StringCRC32(string str)
{
byte[] buffer = Encoding.UTF8.GetBytes(str);
return BytesCRC32(buffer);
}
/// <summary>
/// 获取文件的CRC32
/// </summary>
public static string FileCRC32(string filePath)
{
try
{
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
return StreamCRC32(fs);
}
}
catch (Exception e)
{
Logger.Exception(e);
return string.Empty;
}
}
/// <summary>
/// 获取数据流的CRC32
/// </summary>
public static string StreamCRC32(Stream stream)
{
CRC32Algorithm hash = new CRC32Algorithm();
byte[] hashBytes = hash.ComputeHash(stream);
return ToString(hashBytes);
}
/// <summary>
/// 获取字节数组的CRC32
/// </summary>
public static string BytesCRC32(byte[] buffer)
{
CRC32Algorithm hash = new CRC32Algorithm();
byte[] hashBytes = hash.ComputeHash(buffer);
return ToString(hashBytes);
}
#endregion
}
}