在Postgres SQL中将SHA1签名存储为主键

dam*_*boy 11 postgresql sha1 primary-key

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

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

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

有想法的人吗?

Mag*_*der 5

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

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


woj*_*ojo 0

请小心这对索引 b 树的影响。由于 SHA1 不是连续的,因此由于 b 树中的所有跳转,您的写入速度会非常慢。

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

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

  • 无论如何,对“B-Tree”的写入都是连续的,搜索要链接的页面会跳转。然而,均匀分布值将使树更加平衡,搜索速度更快,而不是更慢。 (9认同)