模糊数据库ID

Jim*_*mBo 7 php mysql database

我有一个主键自动递增的表.我希望有一个与主键关联的图像,但我不希望显示主键.将图像命名为:

$filename = md5($primarykey + $secret_string) . '.jpg';
Run Code Online (Sandbox Code Playgroud)

是个好方案吗?

我担心可能会发生冲突并且文件被覆盖.

另一种选择当然是生成一个随机字符串,检查它不作为文件存在并将其存储在数据库中......但如果不需要,id不想存储其他数据.

另一个选项是逻辑转换youtube url样式,例如1 = a 2 = b但是具有随机顺序,例如1 = x 2 = m ...但是那么它有可能被解码...加上md5可能是比任何youtube网址功能轻.

我猜我会处理超过200万条记录,那么碰撞的可能性是什么?您会选择哪个选项,还是想到更好的方法?

Aea*_*Aea 0

您实际上有两个选择:

  • 生成一些东西并验证没有碰撞
  • 生成一些东西并希望没有碰撞

您通常可以使用以下选项: - 哈希值 - 随机生成的字符串 - UUID

哈希 如果您选择哈希,请选择冲突发生率较低的哈希。另外,在进行哈希计算时,请考虑为什么要隐藏数据库 ID。如果你对普通数字进行哈希处理,那么很快就会有人计算出你的哈希值,你绝对需要对其进行加盐。加盐哈希的优点是快速生成和低冲突机会(在小情况下绝对不需要验证这些,因此插入速度更快)。缺点是任何正确的实现都将是 SHA256 或更好,这意味着它很长。如果您想节省数据库/索引空间,您可以进行一些十六进制转换,这可能比您想要的更多。

您可以将其生成为适合您的任意长度、任意字符集或数字 a-Z0-9 的随机字符串。这也意味着在 URI、REQUEST 数据等中使用的较短字符串中包含“更多”数据。缺点是您必须检查它是否在数据库中。

UUID 就像哈希一样,生成速度快,冲突的可能性相当低,并且可以修改为比纯输出“不那么”难看。

我的建议不要这样做。我之前曾在一个非常大的实现中处理过这个问题,这个实现是从一个非常小的实现发展而来的。最终,您开始做“聪明”的事情,例如创建完全唯一的标识符(例如内容类型+您的标识符)并开始看到其中的一些价值,但随后您必须处理规模问题。扩展这个是非常困难的。DB 针对 ids 作为主键进行了优化,如果您希望它垂直扩展,您需要投入大量的思考。如果必须,请仅将其用于外部客户端交互。