2014-10-12 63 views
0

我需要计算CRC,以便形成一个INTEL机器上的散列函数,并具有以下两个固有功能上来:32和位固有之间64选择CRC英特尔CPU

  1. _mm_crc32_u32
  2. _mm_crc32_u64

在我的项目,我处理32位变量和我的困境是移位和或运算每两个变量(因此产生一个64位的变量),然后使用64位的CRC或运行之间在两个32-bi的每一个上都有32位CRC t变量。

我无法在任何地方找到这些功能中每一个所用的周期数量,并且从英特尔功能规格中不清楚哪一个更可取。

同样的困境也适用于CRC功能的16位版本:

_mm_crc32_u16

我试图通过之前抽空和CRC校验后它。结果几乎相同。所以我需要更复杂的计算方法。

+0

如果你想基准的选择,这里是一个开始: http://stackoverflow.com/questions/15752770/mm-crc32-u64-poorly-defined/15754706#15754706 _mm_crc32_u64是不可用在32位版本中。 – ScottD 2014-10-13 22:06:55

回答

1

不要对散列值使用CRC。这不是一回事。 使用murmurhash进行经典计算机科学散列需求(即,不是巨大的加密强度散列)。这也有不同宽度的实现。

我不明白你的意思:你有两个32位值,并希望有一个散列?这可能是明智的,也可能不是,取决于原因。你能澄清你想完成什么吗?

+0

嗨,我想尽可能多地保存周期,我的困境是在两个32位值上使用32位CRC两次,或者使用移位和OR将它们组合成一个64位值并在其上运行CRC函数。我认为这个问题可以归结为64位和32位CRC或移位和OR操作之间的差异更大。而我使用crc的原因是因为它具有固有的功能 – 2014-10-12 06:52:36

+1

再次说同样的事情没有帮助。只有32位输入的CRC有什么意义?那是你在说什么?你为什么要配对输入大小和CRC长度?这让我觉得我不理解。在当前的处理器上,CRC是*不快*,因为它使用一张表。解释不同于“两个32位值”或示例。 – 2014-10-12 07:01:10

+1

@ Anton.P:你有没有尝试测量性能?哪一个能更快地为你做这件事?确保当第一个已经运行的其他好处不会影响缓存未命中的时候。您计算CRC的数据量有多大?它如何对齐? – 2014-10-12 07:09:39