【发布时间】:2018-07-30 10:30:04
【问题描述】:
假设我有包含 3 个异构整数类型(int16_t、int32_t、int64_t)的三元组,我想为这 3 个值计算一个 8 位无符号校验和。假设所有值在所有有效位上均匀分布,因此我们不能通过在连接它们时截断任何值来作弊。
对于我来说,计算具有相对较低冲突率和非加密属性的校验和的快速方法是什么?我猜我可以连接字节并使用 Fletcher 校验和或 Pearson 散列的变体,但我见过的所有实现似乎都过时了,我想看看我是否可以进一步利用任何 SIMD 或属性现代(Skylake)建筑。
我也知道 MurmurHash,但它没有 8 位实现。
【问题讨论】:
-
这实在是太宽泛了,需要征求意见。你应该测试一下。 Murmur 不错,Spooky 也不错,openSSL 也有不错的。您只需要测试您的实现,查看 Linux 上的
clock_gettime函数或 windows 上的QueryPerformanceCounter来计算散列时间。 (而且校验和和哈希不完全一样,所以要校验和再讨论哈希有点不清楚) -
@DavidC.Rankin 我不认为 Murmur 或 Spooky 有 8 位实现?
-
了解,但所有哈希算法(已讨论)都是开源的,因此您可以定制(破解)它们以一次处理一个字节。我只是在看 murmur、yale_hash、djb2 和 fnv1。每次修改一个字节都不会太难。
-
@DavidC.Rankin 感谢您的意见。我希望您看到我的问题不是如何对现有的实现进行基准测试,而是我一开始就没有这样的实现。此外,这不是一次取一个字节,而是自己产生一个 8 位校验和。例如,将它们中的任何一个更改为 SIMD 实现并非易事。
-
Assume all of the values have uniform distribution across all the significant bits ...:: 一切顺利;只需添加它们(这是 IP 校验和所做的)或异或它们。... seen of those seem dated因为没有更好的解决方案。