Postgresql 随机id'的方法是什么;web应用程序中的s
我的URL如下所示:Postgresql 随机id'的方法是什么;web应用程序中的s,postgresql,sqlalchemy,obfuscation,uuid,Postgresql,Sqlalchemy,Obfuscation,Uuid,我的URL如下所示: http://domain.com/object/23/ http://domain.com/object/23-74938/ 我更希望23不是连续的和相当随机的。我在Stack Overflow上看到过其他帖子,他们也问过同样的问题,但我的要求与我看到的有所不同 我的许多网站用户都是竞争对手,他们很容易通过一些数字获得竞争信息。我这样做并不是为了安全,我明白通过默默无闻来实现安全是浪费时间。我只是想找一个快速的方法来防止人们到处乱摸 我使用python/SQLAlch
http://domain.com/object/23/
http://domain.com/object/23-74938/
我更希望23不是连续的和相当随机的。我在Stack Overflow上看到过其他帖子,他们也问过同样的问题,但我的要求与我看到的有所不同
我的许多网站用户都是竞争对手,他们很容易通过一些数字获得竞争信息。我这样做并不是为了安全,我明白通过默默无闻来实现安全是浪费时间。我只是想找一个快速的方法来防止人们到处乱摸
我使用python/SQLAlchemy和Postgres数据库来实现这一点。我已经看过UUID主键,但它们似乎是一个巨大的性能打击,因为我有很多连接正在发生。我还可以在另一列中执行UUID,然后根据顺序积分主键执行所有连接
大多数需要此功能的表的记录数都少于1000条。但是一个表会有几百万条记录。如果没有这个表,我只需要使用uuid,就可以使用它了。但既然我这么做了,我真的不认为uuid是一个很好的选择
真正的问题是我还有什么其他选择
在这里,性能是最重要的,同时仍然保持一定程度的随机性和较低的碰撞概率。对#1进行加密/解密的最佳选项是什么?对#2进行加密/解密的最佳哈希算法是什么。有没有比这两种方法更明显的方法?有几百万行的uuid不会让我太慢,这就是解决方案吗?对于您试图实现的目标来说,散列/加密似乎有些过分了。用一个单独的列存储10000到99999(或100000、999999等)之间的随机数,然后链接如下:
http://domain.com/object/23/
http://domain.com/object/23-74938/
其中“74938”是随机位我会选择类似于选项2的内容:例如,将HMAC与SHA1一起使用,以生成一个哈希值,该值可以针对每个请求进行验证,而无需靠近数据库。我经常制作这样的防篡改“票据”。e、 g
use Digest::HMAC_SHA1 qw(hmac_sha1_hex);
$id = shift;
print "$id.", substr(hmac_sha1_hex($id, "s3kr1t"), 0, 8), "\n"
并核实:
use Digest::HMAC_SHA1 qw(hmac_sha1_hex);
$tkt = shift;
($id,$sum) = ($tkt =~ /(.+)\.([0-9a-f]+)/)
or die "Invalid tkt (bad format): $tkt\n";
$sum eq substr(hmac_sha1_hex($id, "s3kr1t"), 0, 8)
or die "Invalid tkt (MAC mismatch): $tkt\n";
print $id, "\n"
这将为id 23生成一个“23.3b30e326”的“票证”。为了从序列中生成唯一的随机标识符,使用密码可能是一个好主意。由于它们的输出是双射的(输入值和输出值之间有一对一的映射)与哈希不同,您将不会有任何冲突。这意味着您的标识符不必像散列一样长 大多数加密密码可用于64位或更大的块,但PostgreSQL wiki有一个可用于(32位)
int
type的函数。免责声明:我本人没有尝试过使用此功能
要将其用于主键,请从wiki页面运行CREATE函数调用,然后在空表上执行以下操作:
ALTER TABLE foo ALTER COLUMN foo_id SET DEFAULT pseudo_encrypt(nextval('foo_foo_id_seq')::int);
瞧
pg=> insert into foo (foo_id) values(default);
pg=> insert into foo (foo_id) values(default);
pg=> insert into foo (foo_id) values(default);
pg=> select * from foo;
foo_id
------------
1241588087
1500453386
1755259484
(4 rows)
“他们看起来像是一个巨大的表演热”。你测试过这个假设吗?性能影响有多大?是什么让您认为生成UUID会影响性能?生成的成本基本上是生成随机128位数字的成本。比较这种大小的整数的成本是可以忽略的。UUID的随机性会对性能造成影响: