我正在尝试将 c# 代码转换为 swift,其中我尝试将字符串转换为 sha1 哈希值。我正在尝试快速实现类似的结果。但是我得到了不同的结果。如果我遗漏了什么,有人可以指出我正确的方向吗?任何帮助是极大的赞赏。
C# 代码
public static string toSha1Digest(this string str)
{
using (SHA1 sha1 = new SHA1CryptoServiceProvider())
{
var mStr = "test1234";
var uni = new byte[mStr.Length * 2];
var encoder = Encoding.Unicode.GetEncoder();
encoder.GetBytes(mStr.ToCharArray(), 0, mStr.Length, uni, 0, true);
var hByte = sha1.ComputeHash(uni);
var buildString = new StringBuilder();
hByte.ToString();
for (var i = 0; i < hByte.Length; i++)
{
buildString.Append(hByte[i].ToString("X2"));
}
var convertedString = buildString.ToString();
buildString = null;
Array.Resize<byte>(ref uni, 0);
Console.WriteLine(convertedString);
}
}
Run Code Online (Sandbox Code Playgroud)
印刷
5387F24564B241075F48BBDFDDDC12640015E92A
Run Code Online (Sandbox Code Playgroud)
SWIFT代码
5387F24564B241075F48BBDFDDDC12640015E92A
Run Code Online (Sandbox Code Playgroud)
印刷
9BC34549D565D9505B287DE0CD20AC77BE1D3F2C
Run Code Online (Sandbox Code Playgroud)
正如评论中已经说过的,Encoding.Unicode获取 UTF-16 格式的编码,更准确地说:小端字节顺序的 UTF-16,没有字节顺序标记。对应的 SwiftString.Encoding是.utf16LittleEndian,即
let data = "test1234".data(using: .utf16LittleEndian)
Run Code Online (Sandbox Code Playgroud)
您的 Swift 代码生成与 C# 程序相同的哈希值。
在这里查看: