为了保持一致性,我发现自己需要为一串数据生成校验和.广义的想法是客户端可以根据收到的有效负载重新生成校验和,从而检测传输过程中发生的任何损坏.我隐约意识到这种事情背后有各种各样的数学原理,如果你试图自己滚动,那么微妙的错误就很容易使整个算法失效.
所以我正在寻找有关散列/校验和算法的建议,其标准如下:
它将由Javascript生成,因此需要在计算上相对较轻.
验证将由Java完成(虽然我看不出这实际上是一个问题).
它将采用中等长度的文本输入(URL编码的Unicode,我相信是ASCII); 通常约200-300个字符,在所有情况下都低于2000.
输出也应该是ASCII文本,越短越好.
我主要对轻量级的东西感兴趣,而不是让碰撞的绝对最小潜力成为可能.我是否天真地想象一个八字符哈希适合这个?我还应该澄清,如果在验证阶段没有发现腐败,那么这不是世界末日(而且我确实认识到这不会100%可靠),尽管我的其余代码对每个代码的效率都显着降低滑倒的腐败入境.
编辑 - 感谢所有贡献.我选择了Adler32选项,并且它在Java中原生支持,在Javascript中非常容易实现,在两端快速计算并且具有8字节输出,这完全符合我的要求.
(请注意,我意识到网络传输不太可能对任何损坏错误负责,并且不会在此问题上折叠我的手臂;但是添加校验和验证会消除一个故障点,这意味着我们可以专注于其他方面如果再次发生这种情况.)
CRC32在任何语言中都不难实现,它足以检测简单的数据损坏,并且在以良好的方式实现时,它非常快.但是你也可以尝试Adler32,它几乎和CRC32一样好,但它更容易实现(并且速度相同).
维基百科中的Adler32
CRC32 JavaScript实现示例
这两个(或者甚至两个)中的任何一个都可以用Java开箱即用.
是否知道TCP和UDP(以及IP,以太网和......)已经为传输中的数据提供校验和保护?
除非你做的事情非常奇怪,否则如果你看到腐败,那就是非常错误的.我建议从内存测试器开始.
此外,如果使用SSL/TLS,则会获得强大的数据完整性保护.