【问题标题】:What is the time complexity of CRC and how does it compare to MD5?CRC 的时间复杂度是多少,与 MD5 相比如何?
【发布时间】:2021-01-20 17:59:34
【问题描述】:

我想比较 CRC 算法和 MD5 算法的计算复杂度。我发现以下thread 指出MD5 为O(n)。

CRC的时间复杂度是多少? CRC 的时间复杂度与 MD5 相比如何?

我的猜测也是 O(n),因为它必须查看所有要计算的数据。但是,@defines 在他的回答中指出"CRC is computationally much less complex than MD5"

【问题讨论】:

  • 似乎 CRC 也必须是 O(n),因为它的处理时间与输入大小成正比。
  • 它们具有相同的复杂度 O(n)。在您阅读的内容中,“复杂”是指“复杂”而不是“计算复杂性”。
  • 您可以将wiki examplethis answer 中的crc64c() 函数进行比较。在汇编中使用 XMM 寄存器和无进位乘法 (PCLMULQDQ) 可将 CRC 速度提高 20 到 30 倍,比 crc64c() 快。 MD5 只能通过使用 XMM 寄存器来加快速度。
  • (成本与问题规模成正比增加:O(n) 中的上限,Ω(n) 中的下限:Θ(n) 中的成本。常数因子 do 不同。)

标签: algorithm time-complexity md5 crc


【解决方案1】:

是的,CRC 是 O(n),其中 n 是序列的长度。重要的是n前面的常数因子。

【讨论】:

  • 是的,它们都是O(n) ...但是 CRC32 C++ 实现是 13 行代码,带有使用 XOR 的单个 for 循环,MD5 是带有子函数的 3 页代码。因此,从运行时的角度来看,MD5 的速度要慢得多,顺便说一句,SHA1 是 5 页长(也是O(n)),具有更多的子功能,因此它比 MD5 慢
  • 是的,MD5 和 SHA1 等比 CRC 慢。但这与代码行数无关。通常你需要更多的代码行来让事情变得更快。例如,按位 CRC 是 14 行代码。一个快 10 倍以上的逐字节 CRC 是 54 行代码。再快一倍的逐字 CRC 是 376 行代码。
  • @avgJoe 您可以尝试计算操作数,但简单地实现它们并测量目标处理器上的执行时间会更容易、更准确。
  • @Arash - 您可以在 Stack Overflow 上找到基于表格的 CRC 实现进行搜索。对于基于程序集的“折叠”代码,您可以找到适用于 Windows | 的示例。 Visual Studio 在此github repository。汇编代码超过 550 行。
  • n是数据的长度。
猜你喜欢
  • 2017-09-23
  • 1970-01-01
  • 2018-11-24
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2018-07-18
相关资源
最近更新 更多