Хеширование строки в числовое значение в PostgreSQL - PullRequest
29 голосов
/ 21 марта 2012

Мне нужно конвертировать строки, хранящиеся в моей базе данных, в числовые значения.Результатом может быть Integer (предпочтительно) или Bigint.Это преобразование должно быть сделано на стороне базы данных в функции PL / pgSQL.

Может кто-нибудь подсказать мне какой-нибудь алгоритм или любые API, которые могут быть использованы для достижения этой цели?

Я былискал это в гугле часами, пока не нашел ничего полезного: (

Ответы [ 3 ]

40 голосов
/ 22 марта 2012

Просто сохраните первые 32 бита или 64 бита хеша MD5. Конечно, он аннулирует основное свойство md5 (= вероятность столкновения бесконечно мала), но вы все равно получите широкий разброс значений, который, вероятно, достаточно хорош для вашей задачи.

Функции SQL, полученные из других ответов:

Для бигинта:

create function h_bigint(text) returns bigint as $$
 select ('x'||substr(md5($1),1,16))::bit(64)::bigint;
$$ language sql;

Для int:

create function h_int(text) returns int as $$
 select ('x'||substr(md5($1),1,8))::bit(32)::int;
$$ language sql;
13 голосов
/ 21 марта 2012

Вы можете без проблем создать хеш-значение md5:

select md5('hello, world');

Возвращает строку с шестнадцатеричным числом.

К сожалению, нет встроенной функции для преобразования шестнадцатеричного числа в целое, но, так как вы все равно делаете это в PL / pgSQL, это может помочь:

https://stackoverflow.com/a/8316731/330315

4 голосов
/ 21 марта 2012

Должно ли это быть целое число? Модуль pg_crypto предоставляет ряд стандартных хеш-функций (md5, sha1 и т. Д.). Все они возвращают байту. Я полагаю, вы могли бы выбросить некоторые биты и преобразовать bytea в целое число.

bigint слишком мал для хранения криптографического хэша. Самый большой не байтовый двоичный тип, поддерживаемый Pg - это uuid. Вы можете создать дайджест для uuid следующим образом:

select ('{'||encode( substring(digest('foobar','sha256') from 1 for 16), 'hex')||'}')::uuid;
                 uuid                 
--------------------------------------
 c3ab8ff1-3720-e8ad-9047-dd39466b3c89
...