根据前一个问题的答案,512个版本在x64设备上应该更快。即使它是在x86 (32位)设备上执行的,也不应该有太大的差别。
对这种差异有什么解释吗?(或者必须是实现问题。)
以下代码为HMACSHA512返回了将近5秒,HMACSHA256返回了将近2秒:(它运行在三星的J5 (2015年)上,它有一个带有"CPU位架构64位“的Snap巨龙410处理器。)使用Xamarin.Forms PCL,Droid项目。):
private void Button_Clicked(object sender, EventArgs e)
{
ICrypto crypto = DependencyService.Get<ICrypto>();
Stopwatch watch = new Stopwatch();
byte[] b = new byte[64];
watch.Start();
for (int i = 0; i < 10000; i++)
{
b = crypto.CalculateHmac512(b);
}
watch.Stop();
label.Text = watch.ElapsedMilliseconds.ToString();
}和
class Crypto : ICrypto
{
//HMACSHA256 hmac = new HMACSHA256();
HMACSHA512 hmac = new HMACSHA512();
public byte[] CalculateHmac512(byte[] m)
{
return hmac.ComputeHash(m);
}
}(在64位PC上进行100,000次迭代,我得到大约200 64的512,130 64的256。所以我猜Xamarin本身就是32位。但这仍不能解释Android上x2.5的差异。)
发布于 2018-01-31 19:53:04
SHA-512内部哈希块为128位字节,而SHA-256为64位。这可以在64位CPU上提供每秒八进制散列的速度优势,但只适用于大型消息。我会尝试8192在那里有64,和200在那里有10000。
SHA-512压缩功能通常需要比SHA-256更长的时间:结构是接近的,变量是SHA-256的两倍,有80轮,而不是64轮(多25%)。移动的数据也大约是原来的两倍,这通常会带来一些损失。然而,总体上所需的时间可能不足两倍,而且由于散列的消息数量是原来的两倍,所以对于大型消息来说,总体上可能有一些好处。
这个问题比较HMAC-SHA-512和HMAC-SHA-256.与直散列相比,HMAC结构增加了至少3次压缩(长键的压缩更多),这进一步增加了64位版本具有边缘之前的消息大小阈值。HMAC-SHA-512具有64位组消息,执行4次压缩,HMAC-SHA-256执行5次(320次).对于一个8192八进制的消息,这是68比132压缩(5440比8448轮),这给HMAC-SHA-512一个机会。
此外,算法的速度,特别是密码,在很大程度上取决于它们的实现质量,以及它是否适合于手头的硬件。从我们的立场来看,我们甚至无法判断HMACSHA512或HMACSHA256是否是本机代码,只是在时间上编译或解释。除了本机代码之外,对任何东西进行基准测试都是毫无意义的(如果性能真的很重要,关键部分应该是本地的)和更难(结果往往是不稳定的)。
https://crypto.stackexchange.com/questions/55211
复制相似问题