AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 154472
Accepted
Ejonas GGgg
Ejonas GGgg
Asked: 2016-11-08 05:26:34 +0800 CST2016-11-08 05:26:34 +0800 CST 2016-11-08 05:26:34 +0800 CST

使用文本的哈希而不是文本本身来处理 Postgres 中的一行

  • 772

我有一个网站项目,我必须在 postgres 表中处理数千或数万个对象。

最初我的网址是:

example.com/object/{ID}/{TEXT SLUG}/

其中 {ID} 只是一个与我的表中的串行主键相对应的整数,{TEXT SLUG} 除了出于 SEO 友好的原因之外实际上什么都不做。

现在,我想隐藏我的 {ID},因为有人可能只是使用一些简单的脚本请求所有增加 {ID} 的对象并简单地重建我的数据库,我想将 url 设计得更现代

example.com/object/{TEXT SLUG}/

现在,如果我直接使用 {TEXT SLUG} 寻址表,它不会比以前使用 {ID} 简单寻址慢得多,即使使用一些索引,尤其是当它变大时(我希望在 40K 范围内最多 60K 行,但表中目前只有 2K)?

我想使用一些轻量级的散列算法来散列 {TEXT SLUG} 并使用散列对表进行寻址,并添加一个具有散列副本的附加列。由于 Postgres 有 4 或 8 字节整数,我很想使用一些轻量级的 128 位散列算法(例如 Murmurhash),我是否正在考虑使用散列 slug 的想法,还是有什么我不知道的?

postgresql hashing
  • 2 2 个回答
  • 1688 Views

2 个回答

  • Voted
  1. Best Answer
    Daniel Vérité
    2016-11-09T08:16:54+08:002016-11-09T08:16:54+08:00

    现在,如果我直接使用 {TEXT SLUG} 寻址表,它不会比以前使用 {ID} 简单寻址慢得多,即使使用一些索引,尤其是当它变大时(我希望在 40K 范围内最多 60K 行,但表中目前只有 2K)?

    按照今天的标准,60K 行确实很小,并且通过整数主键和索引文本块查找之间的差异在实践中可能并不明显。

    话虽如此,如果您无论如何都必须压缩性能,那么您正在考虑的更改仍有改进的空间。

    首先,实际上不需要为散列值添加列,因为 PostgreSQL 可以直接索引函数结果:

    CREATE INDEX index_name ON table_name(hashfunc(ID));
    

    其次,甚至不需要将散列存储在附加索引中。相反,可以使用保留格式的加密方案通过 slug 以无法猜测的形式导出您的 ID。与哈希相比,这种技术有几个优点:

    • 无存储:ID 到 slug 和 slug 到 ID 的转换由 O(1) 复杂度的不可变函数完成。

    • 哈希在理论上不是唯一的,而加密具有唯一性的数学保证。请参阅哪种散列算法最适合唯一性和速度?对常见的快速散列函数进行很好的研究(当散列数字时报告没有冲突时,请记住它们需要加盐以避免外人猜测)。

    • 128 位输出会产生比 32 位输入所需的更大的 slug。例如,以 base64 表示时,128 位需要最多 24 个字符,而 32 位需要 8 个字符。

    要将具有顺序的 32 位 ID 转换为具有密钥的等效不可猜测序列,我建议使用 skip32,它在此处有一个 plpgsql 实现:https ://wiki.postgresql.org/wiki/Skip32

    然后可以将这个输出按原样推送到 URL 中(但请注意它已签名)。或者,如果您喜欢 text slug,请将其转换为具有您选择的 int-to-text 可逆转换的 slug。

    • 1
  2. Markus
    2016-11-08T06:34:59+08:002016-11-08T06:34:59+08:00

    我会使用 UUID 而不是序列号。有一个模块:https ://www.postgresql.org/docs/current/static/uuid-ossp.html

    • 0

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve