轻量级校验和算法的好选择?

2022-09-04 07:00:46

我发现自己需要为一串数据生成校验和,以实现一致性。大致的想法是,客户端可以根据它接收的有效负载重新生成校验和,从而检测传输过程中发生的任何损坏。我隐约意识到,这种事情背后有各种各样的数学原理,如果你试图自己滚动,微妙的错误很容易使整个算法无效。

因此,我正在寻找有关哈希/校验和算法的建议,并具有以下标准:

  • 它将由Javascript生成,因此需要在计算上相对较轻。
  • 验证将由Java完成(尽管我不认为这实际上是一个问题)。
  • 它将需要中等长度的文本输入(URL编码的Unicode,我相信是ASCII);通常约为 200-300 个字符,在所有情况下都低于 2000 个字符。
  • 输出也应该是ASCII文本,它越短越好。

我主要对轻量级的东西感兴趣,而不是获得绝对最小的碰撞可能性。我会天真地想象一个八个字符的哈希值适合这个吗?我还应该澄清,如果在验证阶段没有发现腐败,那并不是世界末日(我确实意识到这不会是100%可靠的),尽管我的代码的其余部分对于每个漏掉的损坏条目来说效率明显较低。

编辑 - 感谢所有的贡献。我选择了Adler32选项,鉴于它在Java中原生支持,在Javascript中非常容易实现,在两端快速计算并且具有8字节输出,它完全适合我的需求。

(请注意,我意识到网络传输不太可能对任何损坏错误负责,并且不会在这个问题上折叠我的手臂;但是,添加校验和验证可以消除一个故障点,这意味着如果这种情况再次发生,我们可以专注于其他领域。


答案 1

CRC32在任何语言中实现都不太难,它足以检测简单的数据损坏,并且当以良好的方式引入时,它非常快。但是,您也可以尝试Adler32,它几乎与CRC32一样好,但它更容易实现(并且速度同样快)。

维基百科中的Adler32

CRC32 JavaScript 实现示例

这两个(或者甚至两个)中的任何一个都可以在Java中立即使用。


答案 2

是否意识到 TCP 和 UDP(以及 IP、以太网和...)都已经为传输中的数据提供了校验和保护?

除非你正在做一些非常奇怪的事情,如果你看到腐败,有些事情是非常错误的。我建议从记忆测试仪开始。

此外,如果使用 SSL/TLS,则可以获得强大的数据完整性保护。