【发布时间】:2019-04-22 18:09:09
【问题描述】:
我必须在 dart 中将字符串转换为 sha256。例如,我使用 String a = "2424242401224672"; 在下面的代码中,我得到的结果是;摘要:7b73641404a8fe6a4b1161a85db736be2a6c07a046109b993186f7a22190bf13
守则:
String a = "2424242401224672";
var bytes = utf8.encode(a.hashCode.toString());
var digest = sha256.convert(bytes);
print("digest: $digest");
在另一方使用 c# for sha256。他们使用 c# MemoryStream、BinaryFormatter 和 XMLSerilizer 从字符串(对象)中获取字节。
但是当我展示我的结果时,他们告诉我他们在 C# sha256 中得到了不同的结果?
如何使用 Dart sha256 和 C# sha256 获得相同的结果?
更新:
CSharp 中的字符串“2424242401224672”的 sha256 值为: DE4841A9E623AF7D5C598A67C2461702485F6B77C3EB5448FA5E0DDF074C70D8
更新 2:
csharp 代码:
private static string ComputeHash(byte[] objectAsBytes)
{
try
{
SHA256 shaM = new SHA256Managed();
byte[] result = shaM.ComputeHash(objectAsBytes);
return byteArrayToHex(result);
}
catch (ArgumentNullException ane)
{
return null;
}
}
private static byte[] ObjectToByteArray(Object objectToSerialize)
{
MemoryStream ms = new MemoryStream();
//BinaryFormatter formatter = new BinaryFormatter();
System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(objectToSerialize.GetType());
try
{
//Here's the core functionality! One Line!
//To be thread-safe we lock the object
lock (locker)
{
x.Serialize(ms, objectToSerialize);
//formatter.Serialize(fs, objectToSerialize);
}
//return fs.ToArray();
return ms.ToArray();
}
catch (SerializationException se)
{
return null;
}
finally
{
//fs.Close();
ms.Close();
}
}
}
【问题讨论】:
-
我不知道 C# 版本正在做什么来生成该哈希。这似乎不正确。你有 C# 代码吗?
-
您还应该显示 c# 代码。可能是由不同的编码(utf8 vs utf16)引起的
-
我用 c# 尝试了一些常见的编码。它们都不会产生您的哈希码。所以你在c#端做错了(可能和scala端的错误一样)
-
我会尝试获取并更新 csharp 代码
-
我更新了我的问题并添加了 csharp 代码。