Postgresql: md5消息摘要的数据类型



我想使用一些字符串的MD5消息摘要作为表的主键。我应该为这样的字段使用什么数据类型 ?我应该为这个域写什么selectinsert语句?

md5散列作为bytea将只使用16字节而不是32字节用于十六进制表示:

create table t (d bytea);
insert into t (d) values
    (digest('my_string', 'md5')),
    (decode(md5('my_string'), 'hex'));

以上两种形式都可以工作,但要使用更简单的digest功能,必须以超级用户身份安装pgcrypto扩展:

create extension pgcrypto;

使用digest函数或上述decodemd5的组合来搜索某个字符串:

select
    octet_length(d) ba_length,
    pg_column_size(d) ba_column,
    encode(d, 'hex') hex_representation,
    octet_length(encode(d, 'hex')) h_length,
    pg_column_size(encode(d, 'hex')) h_column
from t
where d = digest('my_string', 'md5')
;
 ba_length | ba_column |        hex_representation        | h_length | h_column 
-----------+-----------+----------------------------------+----------+----------
        16 |        17 | 3d212b21fad7bed63c1fb560c6a5c5d0 |       32 |       36
        16 |        17 | 3d212b21fad7bed63c1fb560c6a5c5d0 |       32 |       36

"pg_column_size"为存储空间大小。与十六进制表示相比,bytea表示不到一半。

bytea有一个字节的开销,但是如果填充到8个字节,这将导致明显的浪费。

可以考虑使用uuid类型,它只使用16个字节。在选择它时,您必须使用REPLACE(md5::text, '-', '') as md5之类的东西,但这应该是一个快速的操作。

相关内容

最新更新