11

我想使用某个字符串的 MD5 消息摘要作为表的主键。我应该为这样的字段使用什么数据类型?我应该为该领域写什么select和陈述?insert

4

2 回答 2

13

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与六进制表示相比,它不到一半。

于 2013-04-13T00:33:58.400 回答
3

bytea有一个字节的开销,但是填充到八个字节这将导致大量浪费。

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

于 2014-05-02T21:37:23.807 回答