Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Centro de ayuda/ GaussDB(DWS)/ Preguntas frecuentes/ Uso de la base de datos/ ¿Cómo uso una función definida por el usuario para reescribir la función CRC32()?
Actualización más reciente 2023-10-12 GMT+08:00

¿Cómo uso una función definida por el usuario para reescribir la función CRC32()?

Actualmente, GaussDB(DWS) no tiene una función integrada de CRC32(). En su lugar, puede usar la función definida por el usuario de GaussDB(DWS) para reescribir la función CRC32().

  • CRC32(expr)
  • Descripción: Calcula la redundancia cíclica. El parámetro de entrada expr es una cadena. Si el parámetro es NULL, se devuelve NULL. De lo contrario, se devuelve un valor sin signo de 32 bits después del cálculo de redundancia.

Ejemplo de reescritura de la función CRC32() usando la sentencia de función definida por el usuario de GaussDB(DWS):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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;

Verifique el resultado de reescritura.

1
2
3
4
5
select crc32(null),crc32(''),crc32('1');
 crc32 | crc32 |   crc32
-------+-------+------------
       |     0 | 2212294583
(1 row)

Para obtener detalles sobre cómo usar funciones definidas por el usuario, consulte la sección CREATE FUNCTION.