进一步削减 uuid 以制作短字符串
-
19-09-2019 - |
题
我需要为给定的唯一字符串生成唯一的记录 ID。
我尝试使用 uuid 格式,这似乎不错。
但我们觉得这很漫长。
所以我们需要将 uuid 字符串 9f218a38-12cd-5942-b877-80adc0589315 缩小到更小。通过删除 '-' 我们可以节省 4 个字符。从 uuid 中删除最安全的部分是什么?我们不需要通用唯一的 id,但我们喜欢使用 uuid 作为源,但减少字符串。
我们需要特定于站点/数据库(SQL Server/ADO.NET 数据服务)的唯一 ID。
任何语言的任何想法或样本都可以
提前致谢
解决方案
为什么不而不是仅仅将其转换为一个基地64字符串?你可以把它删减到22个字符的方式。
其他提示
如果您正在使用MS-SQL你应该只使用uniqueindentifier数据类型,它是一种体积小(16个字节),由于SQL引擎知道它可以使用它优化索引和查询。
这是UUID提供(几乎)唯一的128位。你可以把它缩短到16个二进制字节,或22 base64编码字符。我不建议删除UUID的任何部位,否则,它只是失去了它的意义。 UUID的设计,使所有的128位具有意义。如果你想不到的是,你应该使用一些其他架构。
例如,如果你能保证只有版本4点的UUID被使用,则可以采取只是第32位,或仅在过去的32位。你失去了独特性,但你有漂亮的随机数。只是避免被固定的位(版本和变体)。
但是,如果你不能保证,你将有真正的问题。对于版本1点的UUID,第一位将不会在同一天生成的UUID唯一的,最后的位不会在同一系统中生成的UUID是唯一的。即使CRC的UUID,它不能保证,你将有唯一的16个或32位。
在这种情况下,只使用一些其他的方案。生成使用系统随机数发生器一个32位的随机数,并使用它作为您的唯一ID。如果你打算剥离其长度不要依赖的UUID。
UUID 为 128 位或 16 字节。如果不进行编码,您可以获得低至 16 个字节的数据。UUID 通常以十六进制编写,使其成为 32 字节可读字符串。使用其他编码,您会得到不同的结果:
- base-64 将 3 个 8 位字节转换为 4 个 6 位字符,因此 16 个字节的数据变成 22 个字符长
- base-85 将 4 个 8 位字节转换为 5 个 6.4 位字符,因此 16 个字节的数据变成 20 个字符长
这完全取决于您是否想要可读的字符串以及您想要使用的编码的标准/通用程度。
一个UUID具有128位。你有没有考虑做它的CRC?这可能会得到它下降到16或32位容易,而且会使用所有原始信息。如果CRC不够好,你总是可以使用合适的哈希值的前几个字节(SHA256,例如)。
如果你真的想刚切下来的UUID,它的格式在 RFC描述4122 。你应该能够找出哪些部分你实现不从需要。