如果我们只使用第一组连字符之前的前8个字符,这样做是否安全(即:仍然唯一)?
如果这样不安全,是否有一种将其转换为短一些的东西以便用作URL的方法,并可以将其转回十六进制字符以用作查找?我知道可以对其进行base64编码以将其缩短到22个字符,但是否有更短的方式?
编辑 我已经阅读了这个问题,它建议使用base64。还有其他更短的方法吗?
缩短UUID会增加碰撞的概率,虽然可以这样做,但这是一个不好的想法。仅使用8个字符意味着只有4个字节的数据,因此一旦您拥有约2^16个ID就可能会发生冲突 - 远非理想。
最好的选择是获取UUID的原始字节(而不是十六进制表示),并使用base64进行编码。或者,如果您的用户并不关心URL中的内容,那么也不必过于担心。
不要删减UUID中的任何一位:您无法控制生成它的算法,有多种可能的实现方式,算法的实现可能会发生变化(例如:随着您使用的PHP版本的更改而改变)。
如果你问我,在地址栏中看到UUID并不可怕或难懂,甚至简单的谷歌搜索"UUID"也会产生更糟糕的URL,大家已经习惯了看谷歌的URL!
如果你想要更漂亮的URL,看看这篇stackoverflow.com文章的地址栏。他们使用了文章ID,并跟随问题的标题。只有ID部分是相关的,其他所有内容都是为了让读者更容易阅读(试试吧,你可以删除ID后面的任何内容,甚至可以替换为垃圾文本 - 没关系)。
截断uuid并不安全。而且,它们被设计为全球唯一的,所以你缩短它们是没有好运气的。你最好的选择是为每个用户分配一个唯一的数字,或让用户选择一个自定义(唯一)字符串(比如用户名或昵称),可以在你的脚本中解码。因此,你可以有edit?id=.... 或edit?name=blah,然后在你的脚本中将名字解码成uuid。
这取决于你如何生成UUID - 如果你使用PHP的uniqid,那么右侧的数字更加“独特”。然而,如果你要截断数据,那就没有真正的保证它会是唯一的。
不管怎样,我认为这是一个相对不太理想的方法-你是否有办法在查询字符串中使用唯一(最好是有意义的)文本参考字符串,而不是ID?(在没有更多问题领域知识的情况下很难确定,但我始终认为这是更好的方法,即使不考虑SEO等因素。)
如果你采用了这种方法,你也可以让MySQL生成唯一的ID,这可能比在PHP中处理要合理得多。