to_char - Hashing una cadena a un valor numérico en PostgreSQL
substring postgresql (3)
¿Debe ser un número entero? El módulo pg_crypto proporciona una serie de funciones hash estándar (md5, sha1, etc.). Todos vuelven bytea. Supongo que podrías tirar algunos bits y convertir bytea en entero.
Bigint es demasiado pequeño para almacenar un hash criptográfico. El soporte pg de tipo binario no bytea más grande es uuid. Podrías lanzar un resumen para uuid así:
select (''{''||encode( substring(digest(''foobar'',''sha256'') from 1 for 16), ''hex'')||''}'')::uuid;
uuid
--------------------------------------
c3ab8ff1-3720-e8ad-9047-dd39466b3c89
Necesito convertir las cadenas almacenadas en mi base de datos a un valor numérico. El resultado puede ser Integer (preferido) o Bigint. Esta conversión se realizará en el lado de la base de datos en una función PL / pgSQL.
¿Alguien puede indicarme algún algoritmo o cualquier API que pueda usarse para lograr esto?
He estado buscando esto en Google durante horas, no he podido encontrar nada útil hasta ahora :(
Puede crear un valor hash md5 sin problemas:
select md5(''hello, world'');
Esto devuelve una cadena con un número hexadecimal.
Desafortunadamente, no hay una función incorporada para convertir hexadecimal a entero, pero como lo está haciendo en PL / pgSQL, esto podría ayudar:
https://.com/a/8316731/330315
Solo mantenga los primeros 32 bits o 64 bits del hash MD5. Por supuesto, anula la propiedad principal de md5 (= la probabilidad de colisión es infinitesimal) pero aún así obtendrá una amplia dispersión de valores que presumiblemente es lo suficientemente bueno para su problema.
Funciones SQL derivadas de las otras respuestas:
Para Bigint:
create function h_bigint(text) returns bigint as $$
select (''x''||substr(md5($1),1,16))::bit(64)::bigint;
$$ language sql;
Para int:
create function h_int(text) returns int as $$
select (''x''||substr(md5($1),1,8))::bit(32)::int;
$$ language sql;