11

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

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

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

有任何想法的人吗?

4

3 回答 3

6

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

对于 20 字节的键,PostgreSQL 当然一般不会有任何问题,除了性能开销当然比序列更大。

于 2009-10-28T18:29:56.300 回答
3

您可以转换为 hex 或 base64 并使用varchar列,或者尝试将其存储在bytea-typed 列中。我会尝试用两种格式的一堆随机值制作表格,看看它们的表现如何。

有关该类型的信息,请参阅PostgreSQL 文档。bytea

于 2009-10-28T16:58:53.723 回答
0

请注意这会对您的索引 btree 造成什么影响。由于 SHA1 不是连续的,由于 btree 中的所有跳跃,您的写入将非常缓慢。

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

如果您想在知道这一点后将 SHA1 设为您的主键,您可以将其转换为 SHA1 通常显示的标准十六进制格式(便于键入)。我不推荐二进制格式,因为您将无法键入它进行调试等。

于 2009-10-28T17:00:30.360 回答