主键 - 随机字节好或坏

时间:2017-06-05 03:58:00

标签: php mysql encryption random primary-key

我已经阅读了一些关于这个主题的文章,只是希望得到一些关于使用随机主键而不是自动增量的澄清。我正在构建一个应用程序而不是使用自动增量主键,我使用以下代码生成包含数字和字母的随机主键:

$bytes = random_bytes(8);
$bytes = bin2hex($bytes);

我想使用随机主键的原因是为了防止url被篡改。我的应用程序也具有记录级安全性,但我希望随机主键作为次要措施。此外,我将此列设置为唯一,以防止任何罕见的冲突。如果发生冲突我只是在屏幕上出现错误,要求使用重新提交生成另一个随机密钥的表单。所以我的问题如下:

  1. 我的数据库是innodb,我的应用程序是基于关系的(PK / FK关系)。与自动增量键相比,使用随机密钥(使用上面的代码)是否会影响搜索性能和/或索引速度?
  2. 我是否有任何原因我不应该使用随机密钥(作为主要/索引密钥)而不是可能的冲突,我已经防止使用重复的错误处理?
  3. 在我最终确定此申请之前,我是否应该使用其他任何建议或最佳实践,因为它与主键相关,而不是我上面的方式?
  4. 谢谢。同样,我知道还有其他文章,但其中许多已经过时(在php 7随机字节之前)所以我认为id能够重新考虑随机主键是否被认为是最佳实践(为什么或为什么不是)。感谢。

1 个答案:

答案 0 :(得分:1)

糟糕 - 非常糟糕,事实上。 Random primary keys play havoc with MySQL's page cache,这会使性能在负载下变差。这也意味着您将无法使用某些SQL功能,例如多行INSERT。

如果您想保护URL中的ID不被篡改,请考虑在URL中包含标识符的键控哈希值(例如,HMAC)。