Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 随机id'的方法是什么;web应用程序中的s_Postgresql_Sqlalchemy_Obfuscation_Uuid - Fatal编程技术网

Postgresql 随机id'的方法是什么;web应用程序中的s

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

我的URL如下所示:

http://domain.com/object/23/
http://domain.com/object/23-74938/
我更希望23不是连续的和相当随机的。我在Stack Overflow上看到过其他帖子,他们也问过同样的问题,但我的要求与我看到的有所不同

我的许多网站用户都是竞争对手,他们很容易通过一些数字获得竞争信息。我这样做并不是为了安全,我明白通过默默无闻来实现安全是浪费时间。我只是想找一个快速的方法来防止人们到处乱摸

我使用python/SQLAlchemy和Postgres数据库来实现这一点。我已经看过UUID主键,但它们似乎是一个巨大的性能打击,因为我有很多连接正在发生。我还可以在另一列中执行UUID,然后根据顺序积分主键执行所有连接

大多数需要此功能的表的记录数都少于1000条。但是一个表会有几百万条记录。如果没有这个表,我只需要使用uuid,就可以使用它了。但既然我这么做了,我真的不认为uuid是一个很好的选择

真正的问题是我还有什么其他选择

  • 使用顺序数字主键,但在数据库之外使用一些轻量级算法时会动态加密/解密它们

  • 分离列,并在创建行时生成的主\u密钥+机密\u密钥上使用sha1哈希(或其他哈希)。然后我就可以通过这个散列找到行,然后在普通pk上进行所有连接


  • 在这里,性能是最重要的,同时仍然保持一定程度的随机性和较低的碰撞概率。对#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的随机性会对性能造成影响: