我正在尝试将一些存储过程迁移到C#代码。
我试图在C#代码中找到与此函数HASHBYTES('sha1', password)
等效的内容。
T-SQL中HASHBYTES('sha1', "Glenw00d@3")
的生成值为"зmG>”TëÏåÈ“ÇOó26¥"
C#是否具有此T-SQL功能的等效功能?
更新:
我尝试使用此代码:
public static class SHA1Util
{
/// <summary>
/// Compute hash for string encoded as UTF8
/// </summary>
/// <param name="s">String to be hashed</param>
/// <returns>40-character hex string</returns>
public static string SHA1HashStringForUTF8String(string s)
{
byte[] bytes = Encoding.UTF8.GetBytes(s);
var sha1 = SHA1.Create();
byte[] hashBytes = sha1.ComputeHash(bytes);
return HexStringFromBytes(hashBytes);
}
/// <summary>
/// Convert an array of bytes to a string of hex digits
/// </summary>
/// <param name="bytes">array of bytes</param>
/// <returns>String of hex digits</returns>
public static string HexStringFromBytes(byte[] bytes)
{
var sb = new StringBuilder();
foreach (byte b in bytes)
{
var hex = b.ToString("x2");
sb.Append(hex);
}
return sb.ToString();
}
}
但它会返回不同的结果。
var hashString = SHA1Util.SHA1HashStringForUTF8String("Glenw00d@@3");//result for this was d0b76d473e945417ebcf18e5c893c74ff33236a5
答案 0 :(得分:3)
除非您更改默认的编码,否则通常SQL Server将Windows-1252用于VARCHAR()
。
private static readonly Encoding Encoding1252 = Encoding.GetEncoding(1252);
/// <summary>
/// Compute hash for string encoded as Windows-1252
/// </summary>
/// <param name="s">String to be hashed</param>
/// <returns>40-character hex string</returns>
public static string SHA1HashStringForDefaultString(string s)
{
byte[] bytes = Encoding1252.GetBytes(s);
发现问题:
您正在散列两个不同的字符串
HASHBYTES('sha1', "Glenw00d@3")
和
SHA1Util.SHA1HashStringForUTF8String("Glenw00d@@3")
请参阅@
/ @@
?
现在,对于编码,我会说它是Windows-1252。但你可以查看
Select TABLE_NAME, COLUMN_NAME, Columns.COLLATION_NAME From INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Yourtable'
如果您的列的排序规则包含CP1
then it is Windows-1252。
对于输出...如果需要字符串,请将返回值替换为:
return Encoding1252.GetString(hashBytes);
对于Glenw00d@@3
,哈希值为:0LdtRz6UVBfrzxjlyJPHT/MyNqU=
如果你想要一个十六进制字符串,请保持原样,
对于Glenw00d@@3
,哈希值为:d0b76d473e945417ebcf18e5c893c74ff33236a5
如果你想要它base64:
return Convert.ToBase64String(hashBytes);
对于Glenw00d@@3
,哈希值为:0LdtRz6UVBfrzxjlyJPHT/MyNqU=