Encoding 如何缩短UUID?

Encoding 如何缩短UUID?,encoding,uuid,Encoding,Uuid,在项目中,我必须处理v4格式的UUID,例如: 931d4657-2e07-477f-be0c-5dd02906a516 基本上,他们一切都很好,只是手工输入的时间太长了。因此,我正在考虑缩短它们的方法——但同时又不丧失返回原始UUID的能力。因此,只考虑第一个n字节不是一个选项;-) 我的第一个想法是将其表示为unicode字符,而不是十六进制代码,但这会导致不可打印(和不可键入)的字符。所以这也不是一个选择 然后我考虑了Base64(Base58,…)编码,但它们并没有使事情变得明显更短(

在项目中,我必须处理v4格式的UUID,例如:

931d4657-2e07-477f-be0c-5dd02906a516

基本上,他们一切都很好,只是手工输入的时间太长了。因此,我正在考虑缩短它们的方法——但同时又不丧失返回原始UUID的能力。因此,只考虑第一个
n
字节不是一个选项;-)

我的第一个想法是将其表示为unicode字符,而不是十六进制代码,但这会导致不可打印(和不可键入)的字符。所以这也不是一个选择

然后我考虑了Base64(Base58,…)编码,但它们并没有使事情变得明显更短(我没有具体的目标长度,我只是希望它减少相关的字符数,我的意思不是节省2个字符;-)

在保留返回UUID的选项的同时,是否有一个聪明的技巧可以做到这一点?有人知道吗?

uuid的长度为128位(16字节)。如果您删除版本和变体,这里可以删除一些位;但我认为这在您的情况下不是一个选项(您也只能安全地删除6位,请参阅)

使用base64编码将减少约40%

# example uses Ruby
SecureRandom.base64(16) # => UBm-_zkz20ka6dOAA8dkMg
SecureRandom.uuid       # => 3754e815-87fe-4872-8d9b-ae529607c277

您在评论中写道,这是用户的标识符。因此,也许您可以在UI中使用短版本,就像git处理短SHA一样。这取决于您想要处理的实体的数量,但是您应该能够大量减少“处理”,并且仍然具有非常低的碰撞可能性。如果发生冲突,您可以要求用户提供更多的标识符。

UUID是128位的数字;十六进制形式只是供人类使用的一种表示形式,而不是一种密度特别高的表示形式,每个字符3.55位。丢失破折号,它将变为每个字符4位

使用base64代替base16,总共22个字符的每个字符将获得6位。这是你所能做到的最好的,并且让它成为人类可读的。实际上,每个字节可以接近7位,这将减少1-2个字节,但这实质上是更复杂的(即风险),对于这么小的增益是不合理的


从数学上讲,这是你能走的最远的距离,并且仍然能够往返。如果您仍然需要更短的代码,那么您必须放弃它——这可能会对您的总体设计产生其他影响。

“手动键入代码太长了”——这是否意味着您正在向用户展示GUI?因为如果你是,你可能不应该是!不会。它们显示在管理UI中,代表用户(UUID是用户ID,这是我们唯一可以依赖的东西)。因此,关键是让管理员的生活更轻松。