Postgresql 带有PL/pgSQL的CRC32函数
如何将32位循环冗余校验(CRC-32)计算为PostgreSQL中的函数,方法与?您可以自己创建函数,这是PostgreSQL 9.6的一个工作示例Postgresql 带有PL/pgSQL的CRC32函数,postgresql,plpgsql,crc,crc32,Postgresql,Plpgsql,Crc,Crc32,如何将32位循环冗余校验(CRC-32)计算为PostgreSQL中的函数,方法与?您可以自己创建函数,这是PostgreSQL 9.6的一个工作示例 CREATE OR REPLACE FUNCTION crc32(text_string text) RETURNS bigint AS $$ DECLARE tmp bigint; i int; j int; byte_length int; binary_string bytea; BEGIN
CREATE OR REPLACE FUNCTION crc32(text_string text) RETURNS bigint AS $$
DECLARE
tmp bigint;
i int;
j int;
byte_length int;
binary_string bytea;
BEGIN
IF text_string = '' THEN
RETURN 0;
END IF;
i = 0;
tmp = 4294967295;
byte_length = bit_length(text_string) / 8;
binary_string = decode(replace(text_string, E'\\\\', E'\\\\\\\\'), 'escape');
LOOP
tmp = (tmp # get_byte(binary_string, i))::bigint;
i = i + 1;
j = 0;
LOOP
tmp = ((tmp >> 1) # (3988292384 * (tmp & 1)))::bigint;
j = j + 1;
IF j >= 8 THEN
EXIT;
END IF;
END LOOP;
IF i >= byte_length THEN
EXIT;
END IF;
END LOOP;
RETURN (tmp # 4294967295);
END
$$ IMMUTABLE LANGUAGE plpgsql;
灵感来源于一个。我无法从中找到原始代码。您可以自己创建函数,这是PostgreSQL 9.6的一个工作示例
CREATE OR REPLACE FUNCTION crc32(text_string text) RETURNS bigint AS $$
DECLARE
tmp bigint;
i int;
j int;
byte_length int;
binary_string bytea;
BEGIN
IF text_string = '' THEN
RETURN 0;
END IF;
i = 0;
tmp = 4294967295;
byte_length = bit_length(text_string) / 8;
binary_string = decode(replace(text_string, E'\\\\', E'\\\\\\\\'), 'escape');
LOOP
tmp = (tmp # get_byte(binary_string, i))::bigint;
i = i + 1;
j = 0;
LOOP
tmp = ((tmp >> 1) # (3988292384 * (tmp & 1)))::bigint;
j = j + 1;
IF j >= 8 THEN
EXIT;
END IF;
END LOOP;
IF i >= byte_length THEN
EXIT;
END IF;
END LOOP;
RETURN (tmp # 4294967295);
END
$$ IMMUTABLE LANGUAGE plpgsql;
灵感来源于一个。我无法从中找到原始代码。请在第11页中创建它
文本到crc32(用于小尾端)
结果等于java.util.zip.CRC32
如果需要crc32(t文本),可以选择crc32_更新(0,t)
在第11页创建它
文本到crc32(用于小尾端)
结果等于java.util.zip.CRC32
如果需要crc32(t文本),可以选择crc32_更新(0,t)
你需要它做什么?也许一个
md5()
就足够了?我需要它作为外部原因。数据库接收CRC-32校验的字符串。您需要它做什么?也许一个md5()
就足够了?我需要它作为外部原因。数据库接收CRC-32校验的字符串。只需小心使用此函数:如果传递的参数值为NULL,则会导致无限循环。易于修复:将条件如果text_string=''那么
替换为如果COALESCE(text_string'')='',那么
关于我之前的注释,处理NULL参数的更好方法是在这种情况下返回NULL。因此,我们最好在函数的最开始添加一个条件,如如果text\u string为NULL,则返回NULL;如果结束
@NicolasPayart我认为在NULL输入时返回NULL就足够了。谢谢你分享这个例子。为什么返回的是bigint而不是int?我想我在实现中发现了一个bug。我有一个例子,字符串包含一个反斜杠(比如'example\withone-backslax'
),函数出错。我使用更广泛的正则表达式搜索replace(text\u string,E'\\\',E'\\\\\')解决了这个问题。
只要小心使用这个函数:如果传递的参数值为NULL,则会导致无限循环。易于修复:将条件如果text_string=''那么
替换为如果COALESCE(text_string'')='',那么
关于我之前的注释,处理NULL参数的更好方法是在这种情况下返回NULL。因此,我们最好在函数的最开始添加一个条件,如如果text\u string为NULL,则返回NULL;如果结束
@NicolasPayart我认为在NULL输入时返回NULL就足够了。谢谢你分享这个例子。为什么返回的是bigint而不是int?我想我在实现中发现了一个bug。我有一个例子,字符串包含一个反斜杠(比如'example\withone-backslax'
),函数出错。我使用更广泛的正则表达式搜索replace(文本字符串,E'\\',E'\\\\\')解决了这个问题。