缩短UUID以生成较短的字符串。

10

我需要为给定的唯一字符串生成唯一记录ID。

我尝试使用UUID格式,这似乎很好。

但我们觉得它太长了。

所以我们需要缩短UUID字符串9f218a38-12cd-5942-b877-80adc0589315。通过删除“-”可以节省4个字符。从UUID中删除哪个部分是最安全的?我们不需要通用唯一标识符,但我们想使用UUID作为源,但缩短字符串。

我们需要特定于站点/数据库(SQL Server / ADO.NET数据服务)的唯一ID。

任何语言的示例或想法都可以。

提前感谢。

5个回答

10

3

如果您正在使用MS-SQL,您应该使用uniqueindentifier数据类型,它既紧凑(16字节),而且由于SQL引擎知道它,因此可以优化使用它的索引和查询。


1
UUID也是16个字节,所以这并没有使其变小。 - Glenn Maynard
Glenn,uniqueindentifier == UUID,但是OP肯定是在谈论将其存储为字符串。 - H H

3
UUID提供了近128位的唯一性。你可以将它缩短为16个二进制字节或22个base64编码字符。我不建议删除UUID的任何部分,否则它就失去了意义。UUID被设计成所有的128位都有意义。如果你想要比这更少的位数,你应该使用其他方案。
例如,如果你能保证仅使用版本4的UUID,则可以只取前32位或后32位。你会失去唯一性,但你会得到相当随机的数字。只要避免固定的位(版本和变体)。
但是,如果你无法保证这一点,你将遇到真正的问题。对于版本1的UUID,同一天生成的UUID的前几位不会是唯一的,而同一系统生成的UUID的最后几位也不会是唯一的。即使你对UUID进行CRC,也不能保证你会拥有16或32位的唯一性。
在这种情况下,只需使用其他方案。使用系统随机数生成器生成一个32位的随机数,并将其用作您的唯一ID。如果你打算削减长度,请不要依赖UUID。

2

UUID是由128位或16个字节组成的。如果不进行编码,它可以低至16个字节。UUID通常使用十六进制书写,使其成为32个字节可读取字符串。使用其他编码时,会得到不同的结果:

  1. base-64将3个8位字节转换为4个6位字符,因此16个字节的数据变为22个字符长度
  2. base-85将4个8位字节转换为5个6.4位字符,因此16个字节的数据变为20个字符长度

这完全取决于您是否想要可读的字符串以及您想使用多么标准/常见的编码方式。


1

UUID有128位。您考虑过对其进行CRC吗?这可以轻松将其缩减到16或32位,并且会使用所有原始信息。如果CRC不够好,您始终可以使用适当哈希(例如SHA256)的前几个字节。

如果您真的只想缩小UUID,则其格式在RFC 4122中有描述。您应该能够从中找出您的实现不需要的部分。


1
取决于他需要多少独特性。这就是为什么我建议使用CRC和另一种选择。 - Head Geek
1
不幸的是,如果您削减UUID的原始位,就会失去其作为UUID的身份。这是因为需要128位的随机性才能被视为UUID,并将碰撞的可能性足够降低到接近零。 - Chris Dutrow
他不需要它成为UUID,他需要它是一组(本地)唯一的位。 - Head Geek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接