标准UUID很长,您无法通过双击选择整个内容。
e.g。 123e4567-e89b-12d3-a456-426655440000
我喜欢较短的ID。
我希望能够双击ID来选择它。
我的问题是:将标准ID编码为22(ish)字符长base62字母数字字符串是否有任何问题?
e.g。 71jbvv7LfRKYp19gtRLtkn
编辑:已添加上下文
我们的需求是用于NoSQL数据存储服务(如DynamoDB)中的常规数据存储。碰撞不应该发生,但我的理解是UUID的碰撞风险可以忽略不计。标准UUID可以满足我们的需求,所以我要问的是......是否存在任何差异,或者在base62中编码的额外风险或无法预料的问题与标准不存在的UUID?
感谢。
答案 0 :(得分:2)
我认为这是个好主意,我目前正在为自己的项目强烈考虑。
但仅用于外部表示,不适用于内部存储。
实际上, UUID基本上只是128位整数,或者是16个字节或128位的数组。
为了有效地存储数据库,它们应以二进制格式存储(例如,MySQL中的BINARY(16)列)。这样可以节省空间(对于普通的文本表示来说,是16字节vs. 36字节,对于Base62,则是22字节),并且在查询或索引时性能更快(字符串依赖于归类规则,所以排序速度不如数字快)。>
规范表示法是十六进制编码,具有8-4-4-4-12分组,这是基于每组字节的语义含义(在大多数情况下我们并不关心的含义)。>
但这只是一个惯例,根本不是对人类友好的。因此,我认为完全可以接受诸如Base62之类的其他编码,暴露于发生人机交互的地方(例如URL),或者无论如何都是基于文本的接口或存储系统(例如HTTP API或CSV / JSON / XML ...)。
您的应用程序内部应以二进制形式使用它们。我不了解PHP,但是例如Java具有java.util.UUID
类。
对于Java,还有一个非常不错的库,它使原始UUID和Base62文本表示之间的转换非常容易:
https://github.com/Devskiller/friendly-id
有关UUID的更多信息:
答案 1 :(得分:1)
Base62不像base-64那样标准,但是base-64会有两个额外的符号,这些符号可能不允许通过双击选择整个符号。
如何删除破折号( - )?这会使它比原来的短,并且可以通过双击鼠标轻松选择
例如:
123e4567e89b12d3a456426655440000
<强>更新强>
base-64有两种常见的编码:[a-zA-Z0-9 / +]和[a-zA-Z0-9_-]。如果你选择后者,则可以解决你的选择问题
另一方面,我认为base-62比我原先想象的更广泛使用。这是一个关于使用base-62主题的好博客:http://blog.birdhouse.org/2010/10/24/base62-urls-django/
答案 2 :(得分:0)
您的问题的解决方案经常被命名为 Url62 ,有些项目正在使用此约定。他们正在将普通的UUID转换为Base62格式。
如果您使用Java进行开发,请查看FriendlyId项目:https://github.com/Devskiller/friendly-id