将SHA1签名存储为Postgresql中的主键

时间:2009-10-28 16:52:36

标签: postgresql primary-key sha1

我正在编写一个简单的内容管理系统。 我需要存储外部计算的SHA1哈希值作为我最大表的主键。

我显然可以使用序列作为主键并索引SHA1十六进制字符串以进行查找... 但是,我正在寻找一个更优雅的解决方案,我将简单地使用20字节的SHA1计算值作为我要在数据库表中插入/删除/更新的行的给定键。 是否存在可用于存储的高效存储类型,以及稍后将SHA1密钥用作主键?

我显然需要postgres来支持使用20字节值作为完成此操作的键。

任何有想法的人?

3 个答案:

答案 0 :(得分:5)

特别是如果您将二进制参数放入db(例如通过libpq),请使用bytea。如果您想通过简单的文本查询进行大量操作,请转换为hext并存储在text或varchar列中。

PostgreSQL当然对20字节密钥没有任何问题,除了性能开销当然大于序列。

答案 1 :(得分:2)

您可以转换为十六进制或base64并使用varchar列,也可以尝试将其存储在bytea类型的列中。我会尝试用两种格式的随机值制作表格,看看它们的表现如何。

有关该类型的信息,请参阅the PostgreSQL docs on bytea

答案 2 :(得分:1)

小心这对你的索引btree有什么作用。由于SHA1不是顺序的,因为btree中的所有跳转都会导致写入速度非常慢。

如果一个序列不起作用,我通常会推荐一种顺序的GUID / UUID(例如参见SQL Server的NEWSEQUENTIALID())。

如果您想在知道这一点后将SHA1作为主键,则可以将其转换为SHA1通常显示的标准十六进制格式(使其易于键入)。我不建议使用二进制格式,因为您无法为调试等输入它。