C# 如何优化32位体系结构的SipHash

C# 如何优化32位体系结构的SipHash,c#,optimization,hash,cryptography,C#,Optimization,Hash,Cryptography,因此,有点新的提供了一个非常快速的安全PRF(又名键控哈希函数)。我使用,这似乎是最快的C#实现。我的i7 3630QM在64位上获得了相当惊人的性能(1140 MB/s),但当我切换到32位时,性能下降到316 MB/s,这(就我而言)非常慢。SipHash大量使用64位操作,因此也许这并不奇怪,但我想知道如何优化32位处理器(尤其是Intel和ARM)的算法 SHA512还大量使用64位操作,但在同一台PC上,我在64位应用程序中获得294 MB/s,在32位应用程序中获得192 MB/s,

因此,有点新的提供了一个非常快速的安全PRF(又名键控哈希函数)。我使用,这似乎是最快的C#实现。我的i7 3630QM在64位上获得了相当惊人的性能(1140 MB/s),但当我切换到32位时,性能下降到316 MB/s,这(就我而言)非常慢。SipHash大量使用64位操作,因此也许这并不奇怪,但我想知道如何优化32位处理器(尤其是Intel和ARM)的算法

SHA512还大量使用64位操作,但在同一台PC上,我在64位应用程序中获得294 MB/s,在32位应用程序中获得192 MB/s,因此下降幅度远没有这么大

那么,我可以做些什么很酷的技巧和优化来让SipHash在32位体系结构上表现得更好呢?显然,我能做的最好的是在C++ DLL(使用SSE)中实现哈希,但是我正在寻找一个托管的(便携式的-需要在移动电话和桌面上工作)解决方案。 32位版本使用SSE3,但是性能也不是很好,所以可能特定的实现可以做得更好


有一种PRF主要基于SipHash,但设计用于微控制器(32位及以下)。与SipHash每个块使用2轮和4轮终结不同,Chaskey每个块使用8轮和8轮终结。在32位模式下,我的CPU性能比SipHash慢2-3倍,因此这可能不是解决问题的办法。

我想您已经看过SipHash论文第11页第6节中的32位实现注释。@rossum是的,我看过。64位的下限为每个字节3.75个周期,32位的下限为每个字节6个周期。C#的1140 MB/s与316 MB/s之比根本无法接近。但我承认,这些比率非常接近于非SSE C++实现(假设有一些),它不尝试32位特定的优化。我想您已经看过了SIPHASH论文第6页第11页的32位实现注释。64位的下限为每个字节3.75个周期,32位的下限为每个字节6个周期。C#的1140 MB/s与316 MB/s之比根本无法接近。但我承认,这些比率非常接近于非SSE C++实现(假设有一些),它不尝试32位特定的优化。我想您已经看过了SIPHASH论文第6页第11页的32位实现注释。64位的下限为每个字节3.75个周期,32位的下限为每个字节6个周期。C#的1140 MB/s与316 MB/s之比根本无法接近。但我承认,这些比率非常接近于非SSE C++实现(假设存在某些情况,则不尝试32位特定的优化)。