将整数ID转换为带有随机字符的字符串,反之亦然


Convert integer ID to string with random characters, and viceversa

我有一些内容的ID,我有一个url与GET参数如下:id=202(其中202是用户想要观看的内容的ID)。我想避免这种情况,并将ID转换为具有随机字符和数字的字符串,就像YouTube一样(例如:watch?v=QEllLECo4OM),然后将其再次转换为整数,这样我就可以获取内容。

我考虑使用一个包含每个ID和一个字符串的表,每当用户上传新内容时,我生成一个随机字符串并在该表中检查它,以避免重复。

这是唯一的方法吗?或者有没有更好的算法?

谢谢。

有一个库专门用于此任务:hashids。

它不是一个安全库,而是用来混淆数据库中的数字id。

的例子:

$hashids = new Hashids(); 
$id = $hashids->encode(1, 2, 3); // o2fXhV 
$numbers = $hashids->decode($id); // [1, 2, 3]

您可以使用php函数base64_encode (202 => MjAy),然后base64_decode (MjAy => 202)。但如果这是你的意图,这只是有点混淆,而不是"秘密"。

带有ID和随机字符串的表更安全。为什么?

  1. 没有计算来反转ID
  2. 没有人可以从外部猜测或重新计算ID
  3. 没有人知道你已经在数据库中有多少条目作为随机字符串

如果您希望选择一个较短的数字,有选项

  • hex ->将整数ID转换为十六进制数15-F(或123123 -> 1E0F3)
  • 的替代方案是您自己的转换器,参见将基数10转换为基数62 (a- za - z0 -9)

注。为了使自定义转换器更安全,您可以以不同的方式重新排序Base62数组(0-9,a-z, a-z)中的数字和字符,因此哪个字符获得哪个数字并不明显