Postgresql 带有PL/pgSQL的CRC32函数

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

如何将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
    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'\\\\\')解决了这个问题。