将UUID转换为短代码是否安全?(仅使用前8个字符)

hel*_*dre 6 php algorithm uuid base64

我们在数据库中使用UUID作为主键(由php生成,存储在mysql中).问题在于,当有人想要编辑某些内容或查看他们的个人资料时,他们会在网址的末尾有这个巨大的,可怕的,丑陋的uuid字符串.(编辑?ID = .....)

如果我们只使用前8个字符,在第一个连字符之前的所有内容,它是否安全(读:仍然是唯一的)?

如果它不安全,是否有某种方法可以将其转换为更短的内容,以便在url中使用,可以将其转换回十六进制用作查找?我知道我可以对它进行base64编码,将其降低到22个字符,但还有更短的东西吗?

编辑我已经阅读了这个问题,它说使用base64.再一次,什么更短?

Nic*_*son 10

缩短UUID会增加碰撞的可能性.你可以做到,但这是一个坏主意.仅使用8个字符意味着只有4个字节的数据,因此一旦你有大约2 ^ 16个ID,就会发生碰撞 - 远非理想状态.

您最好的选择是获取UUID的原始字节(不是十六进制表示)并使用base64对其进行编码.或者,不要太担心,因为我严重怀疑您的用户关心URL中的内容.

  • 对于记录,通常 4 个字节 = 32 位,因此它将是 2^32 而不是 2^16 (3认同)
  • FWIW 由于生日悖论,您预计会在 2^16 条记录之前发生冲突 (2认同)

Cos*_*und 8

不要从UUID中删除一个位:您无法控制生成它的算法,有多种可能的实现,算法实现可能会发生变化(例如:使用您正在使用的PHP版本更改)

如果你问我地址栏中的UUID看起来并不可怕或者很难,即使是简单的谷歌搜索"UUID"也会产生看起来最糟糕的URL,而且每个人都习惯于查看谷歌URL!

如果您想要更好看的URL,请查看此stackoverflow.com文章的地址栏.他们使用文章ID,然后是问题的标题.只有ID部分是相关的,其他一切都是为了让读者的眼睛变得容易(继续尝试它,你可以删除ID之后的任何东西,你可以用垃圾替换它 - 无关紧要).