11

我正在为数据集提供哈希,以便对数据进行指纹识别并通过哈希识别它——这是快速哈希(如 SHA1 和 MD5)的核心用例。

在 .Net 中,可以选择使用其中一些哈希的本机或托管实现(无论如何是 SHA 变体)。我正在寻找一个 MD5 托管实现,在 .Net 框架中似乎没有,但想知道包装的本机 CSP 是否更快,如果我应该只使用它的内容,将没有性能使用它的问题。为什么 .NET 框架中没有托管 MD5 实现的最佳答案?表示更快的性能可能是托管变体不存在的原因。

这是真的吗?如果是的话,原生 CSP 的速度有多快?

4

1 回答 1

21

不幸的是,MD5 的封装原生 CSPMD5CryptoServiceProvider比纯托管实现慢得多。这是一个顽固的观点,认为本机代码明显比托管代码快:在许多情况下,情况恰恰相反。至少在头对头测量中就是这种情况。

使用David Anson 翻译的参考 MD5 实现,我构建了一个快速的性能测试来源) 旨在衡量两种实现之间的性能差异。虽然对于小型数据阵列,差异可以忽略不计,正如预期的那样,在大约 16kB 时,本机实现开始显示潜在的显着延迟 - 大约为毫秒。这可能看起来不多,但它比纯托管实现慢几个数量级。随着被散列的数据大小的增加,这种差异保持不变,并且在最大的测试数据数组 - ~250MB - CPU 时间的差异约为 8.5 秒。考虑到像这样的哈希通常用于对非常大的文件进行指纹识别,这种额外的延迟会变得很明显,即使 I/O 的延迟通常要大得多。

目前还不清楚延迟来自何处,因为没有执行纯本机测试(这将免除 CSP 的包装和托管代码中的消耗),但考虑到对数刻度上的图形几乎相同的形状,看起来托管和本机实现具有相同的内在性能,但本机代码性能可能由于运行时本机和托管代码之间的互操作成本而在性能上“下移”。封装的本地 CSP 和纯托管实现之间的这种性能差异也已被其他调查人员复制和记录

除了在这个特殊的案例中回答“原生实现速度快多少”这个问题之外,我希望这个证据能够在原生与托管的问题出现时引发更多的反思和调查,打破长期以来对类似的问题是原生代码总是更快,因此,不知何故,更好。托管代码显然非常快,即使在这个对性能敏感的批量数据散列领域也是如此。

MD5 哈希计算时间 MD5 哈希计算时间(对数)

于 2013-02-13T09:52:37.123 回答