2016-11-20 66 views
1

我一直在寻找一个Lua实现CRC32的和偶然发现了这一点: https://github.com/openresty/lua-nginx-module/blob/master/t/lib/CRC32.luaCRC32整数哈希串

但是它返回的整数哈希,我将如何去获取字符串等同的吗?

使用输入 “东西”,它返回:1850105976

使用在线CRC32发生器我得到: “879fb991”

+1

应该是'09DA31FB' –

+1

至少存在[9个不同的CRC32款项(http://www.sunshine2k.de/coding/javascript/crc/crc_js.html) –

+0

我明白了,但并没有真正回答我的问题 – user1826176

回答

4

有很多CRC32算法。您可以在this catalog中找到十个不同的CRC-32。您找到的Lua代码和您找到的在线CRC32(某处 - 没有提供链接)是不同的CRC-32。

你似乎认为“串等效”是32位整数的十六进制表示。在Lua中,您可以使用string.format和打印格式%x来获取十六进制。对于你给出的例子,1850105976,那将是6e466078

您的“在线CRC32生成器”似乎在使用BZIP2 CRC-32,虽然它显示了反向顺序(小端)的结果CRC的字节。所以在这种情况下,十六进制的实际CRC是91b99f87。您找到的Lua代码似乎正在使用MPEG-2 CRC-32。这两者之间的唯一区别是排他性或与ffffffff。因此,实际上,您从两个不同来源(6e466078^91b99f87)获得的两个CRC的排他性是ffffffff

+0

非常感谢Mark! – user1826176

+1

@ user1826176你也可以试试:https://github.com/hjelmeland/luacrc32(可通过Luarocks在https://luarocks.org/modules/hjelmeland/crc32) – hjpotter92

+1

@ hjpotter92那看起来好多了。它是更标准的PKZip/ITU v.42 CRC-32,并且实现似乎使用真正的位操作(移位和异或),而不是在问题中链接的代码中使用算术的非常慢的实现。 –