Есть ли в PostgreSQL хэш-функция? - PullRequest
2 голосов
/ 23 июля 2011

Я использую Sphinx для индексации своей базы данных.Проблема в том, что я должен отфильтровать результат по символьному полю.Поэтому я должен найти способ конвертировать символы, изменяющиеся до sql_attr_uint.Я знаю, что CRC32 в MySQL может добиться цели.Есть ли CRC32 или какая-либо замена в PostgreSQL?

Ответы [ 2 ]

7 голосов
/ 11 марта 2012

Это функция CRC32, которая определяет мышления сфинкса ( драгоценный камень ):

CREATE OR REPLACE FUNCTION crc32(word text)
RETURNS bigint AS $$
DECLARE tmp bigint;
DECLARE i int;
DECLARE j int;
DECLARE byte_length int;
DECLARE word_array bytea;
BEGIN
IF COALESCE(word, '') = '' THEN
return 0;
END IF;

i = 0;
tmp = 4294967295;
byte_length = bit_length(word) / 8;
word_array = decode(replace(word, E'\\\\', E'\\\\\\\\'), 'escape');
LOOP
tmp = (tmp # get_byte(word_array, 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;
2 голосов
/ 23 июля 2011

Может быть, вы можете использовать decode(substring(md5('foo') for 8), 'hex').Это даст вам байты первых 4 байтов хеша md5 этой строки.

Вы можете преобразовать его в целое число, используя что-то вроде:

create function bytea_to_integer(bytea)
returns integer strict
language sql as $$
  select
     (get_byte($1,0)*1::integer<<0*8)
    +(get_byte($1,1)*1::integer<<1*8)
    +(get_byte($1,2)*1::integer<<2*8)
    +(get_byte($1,3)*1::integer<<3*8);
$$;
...