【发布时间】:2011-07-25 17:39:15
【问题描述】:
我的网址如下所示:
http://domain.com/object/23/
我希望 23 不是连续的并且相当随机。我在 Stack Overflow 上看到过其他帖子问同样的问题,但我的要求与我所看到的有点不同。
我使用该网站的许多人都是竞争对手,他们很容易用一些数字来获取竞争信息。我这样做不是为了安全,我知道通过默默无闻的安全是浪费时间。我只是在寻找一种快速的方法来防止人们四处闲逛。
我正在使用带有 Postgres 数据库的 python/SQLAlchemy 执行此操作。我查看了 UUID 的主键,但它们似乎对性能造成了很大的影响,因为我有很多连接发生。我还可以在附加列中执行 UUID,然后根据顺序积分主键执行所有连接。
大多数需要此功能的表的记录数少于 1000 条。但是一张表会有几百万条记录。如果没有那个表,我只会使用 uuid 并完成它。但既然我这样做了,我真的不认为 uuid 是一个很好的选择。
真正的问题是我的其他选择是什么。
使用顺序数字主键,但在数据库外部使用一些轻量级算法动态加密/解密它们
分离列并在创建行时生成的 primary_key + secret_key 上使用 sha1 哈希(或其他哈希)。然后我可以通过这个哈希找到行,然后在正常的pk上做所有的连接。
性能是这里最重要的事情,同时仍然保持一定程度的随机性,碰撞的可能性很小。 #1的加密/解密的最佳选择是什么,或者#2的最佳哈希算法是什么。有没有比这两个更明显的方法?有几百万行 uuid 不会让我放慢速度,这就是解决方案?
【问题讨论】:
-
“它们似乎对性能造成了很大的影响”。你测试过这个假设吗?性能影响有多大?
-
是什么让您认为生成 UUID 会影响性能?生成的成本基本上是生成一个随机 128 位数字的成本。比较这种大小的整数的成本可以忽略不计。
-
UUID 的随机性带来了性能损失:stackoverflow.com/a/1151733/23368
标签: postgresql sqlalchemy obfuscation uuid