【发布时间】:2019-10-07 22:03:47
【问题描述】:
在我的应用程序中,大部分 ID(user_id、classic_id、post_id、assessment_id 等)都是公开的,这意味着它们要么在 URL 中,要么在目录名称中。出于安全原因,我希望每个表都有 10 个字符的随机 ID,而不是自动递增的。
我可以使用时间戳,但这并不是真正唯一的,并且添加了随机数会变得更长(例如,我必须添加 4 个随机数以每秒处理多达 10.000 个数据库插入到一个表中...... . 纯粹假设它不可扩展)。
现在我希望创建一个 10 个字符的随机 ID,这将给我 100 亿个可能的 ID 组合。所以产生重复的机会很小,长度也可以接受。
use Keygen;
$id = Keygen::numeric(10)->generate();
你认为我的想法有道理吗?有谁知道使用 10 个字符的主 ID 是否会对我的数据库性能产生负面影响?谢谢!
【问题讨论】:
-
YouTube 使用了 11 个看似字母数字的字符。如果您关心的是 URL 上的内容,那么 6 个字母数字字符可能比 10 个数字看起来更好,并为您提供大约 570 亿个可能的值。如果您关心的是存储,那么 6 个字母数字 ASCII 字符占用 6 个字节,但 long 占用 8 个字节,因此稍微小一些。另一方面,如果你确实使用了 long 那么你真的会浪费它,因为 long 最多可以容纳大约 20 位数字
-
@KyleWardle 不幸的是,UUID 不是 URL 友好的。
-
@apokryfos 是的,我考虑过使用 6 个字母数字字符。但是,使用字母数字字符串作为主 ID 会大大降低数据库速度。
-
这里的想法是您仍然会使用自动递增的主 ID 来提高速度,但只能在内部使用它们。将它们添加到模型的
$hidden数组中可以防止它们意外暴露在 json 响应中
标签: php laravel auto-increment