C# 和 OpenResty 中进行 CRC32
一、C# 进行 CRC32
public class CRC32
{
private static readonly uint[] _crc32Table;
static CRC32()
{
uint crc;
_crc32Table = new uint[256];
int i, j;
for (i = 0; i < 256; i++)
{
crc = (uint)i;
for (j = 8; j > 0; j--)
{
if ((crc & 1) == 1)
crc = (crc >> 1) ^ 0xEDB88320;
else
crc >>= 1;
}
_crc32Table[i] = crc;
}
}
/// <summary>
/// 获取CRC32校验值
/// </summary>
public static uint GetCRC32(byte[] bytes)
{
uint value = 0xffffffff;
int len = bytes.Length;
for (int i = 0; i < len; i++)
{
value = (value >> 8) ^ _crc32Table[(value & 0xFF) ^ bytes[i]];
}
return value ^ 0xffffffff;
}
/// <summary>
/// 获取CRC32校验值
/// </summary>
public static uint GetCRC32(string str)
{
byte[] bytes = Encoding.UTF8.GetBytes(str);
return GetCRC32(bytes);
}
}
使用方法
string dataStr = "1234567890";
var crcUint = CRC32.GetCRC32(dataStr);
var crcHex = string.Format("{0:X8}", crcUint);
Console.WriteLine($"{dataStr} => CRC32 Uint: {crcUint}, Hex: {crcHex}");
结果:1234567890 => CRC32 Uint: 639479525, Hex: 261DAEE5
二、OpenResty 中进行 CRC32
location /lua_crc {
content_by_lua_block
{
local str = "1234567890"
local crc32_long = ngx.crc32_long(str)
ngx.say(str .. " => CRC32 long: " .. crc32_long, "</br>")
}
}
结果:1234567890 => CRC32 long: 639479525
C# 和 OpenResty 中进行 CRC32 的结果是一致的。