
# 如何使用DWS自定义函数改写CRC32()函数
DWS目前未内置CRC32函数，但如果需要实现MySQL中的CRC32()函数功能，用户可使用DWS的自定义函数语句对其进行改写。
- 函数：CRC32(expr)
- 描述：用于计算循环冗余值。入参expr为字符串。如果参数为NULL，则返回NULL；否则，在计算冗余后返回32位无符号值。
DWS的自定义函数语句改写CRC32函数示例：
```
CREATE OR REPLACE FUNCTION crc32(text_string text) RETURNS bigint AS $$
DECLARE
    val bigint;
    i int;
    j int;
    byte_length int;
    binary_string bytea;
BEGIN
    IF text_string is null THEN
        RETURN null;
    ELSIF text_string = '' THEN
        RETURN 0;
    END IF;
    i = 0;
    val = 4294967295;
    byte_length = bit_length(text_string) / 8;
    binary_string = decode(replace(text_string, E'\\', E'\\\\'), 'escape');
    LOOP
        val = (val # get_byte(binary_string, i))::bigint;
        i = i + 1;
        j = 0;
        LOOP
            val = ((val >> 1) # (3988292384 * (val & 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 (val # 4294967295);
END
$$ IMMUTABLE LANGUAGE plpgsql;
```
验证改写后的结果：
```
select crc32(null),crc32(''),crc32('1');
 crc32 | crc32 |   crc32
-------+-------+------------
       |     0 | 2212294583
(1 row)
```
有关自定义函数的更多用法，可参考[CREATE FUNCTION](https://support.huaweicloud.com/sqlreference-dws/dws_06_0163.html)章节。
