通过使用UUID是否可以生成16个字符的字符串?

时间:2017-07-12 09:33:09

标签: java uuid

我尝试过UUID并生成32个字符串。但我想要16个字符的唯一字符串

8 个答案:

答案 0 :(得分:0)

然后不要使用UUID。

您可以从long生成一个16个字符的十六进制字符串。

首先生成long

  1. 您可以维护一些long计数器(以确保生成的标识符是唯一的)
  2. 或生成随机long - 冒着获得重复值的风险。
  3. 或者使用将随机性与唯一性相结合的方法 - 例如,生成随机数的k位(k < 64),并将这些位连接到唯一编号的64-k位从一些柜台获得。
  4. 获得long值后,您可以将其转换为带String的十六进制Long.toString(longValue,16)。请注意,您可能需要添加前导&#39; 0&#39; 0要获得16个字符String的字符。

答案 1 :(得分:0)

它必须有32个字符才是唯一的。

懒惰的方式:只有前16个字符(可能并不总是有效)

正确的方法:找到一个可以将32个字符的UUID分解为16个字符的UUID的公式。

不同的方式:改为使用哈希码(只在需要UUID一次时才有效)

答案 2 :(得分:0)

根本不可能:java UUID表示128位值 - 您不能用16个HEX字符表示它!

你可以取数值并打印base 36,但这仍然不适合16个字符(总是)。

换句话说:您必须以另一种方式进行研究,例如将 long 值转换为所需长度的字符串。

答案 3 :(得分:0)

无法生成16个字符长度的UUID

因为UUID代表128位值。

但是可以生成不使用UUID的16个字符的唯一字符串。

答案 4 :(得分:0)

有不同类型的UUID,对应不同的用法。 Java SDK UUID允许处理版本1(基于时间的)UUID,但遗憾的是不允许构建它们。版本3和5假定您已经有不同的名称,版本4是​​伪随机的。如果您有一个单独的生成器,则可以在版本1 UUID中抛弃节点身份验证,并且只保留最长的生成器。但是,与其他机器生成的 UID 发生冲突的风险只会是同时生成它的风险。

无论如何,期望只有64位的全球唯一标识符将非常乐观,UUID为128位长的原因

TL / DR:对于单台计算机的唯一ID,您可以安全地保留与JUG生成的基于时间戳的UUID相比最长的ID。如果你需要几个发生器,你将不得不想象一个专用的算法。如果你这样走,RFC4122会很有意思......

答案 5 :(得分:0)

由于UUID是128位,128/16 = 8,因此需要将8位填充到每个字符中。因此,您可以将UUID表示为char[16] - 但它不能作为字符串打印。

ASCII仅使用7位,其中许多是不可打印的。

您可以通过识别256个可打印的unicode代码点(例如,dingbats,中文字符等)并将这些数字映射到值来将8位数字表示为长度为1的字符串。这将允许您在具有unicode功能的显示器上显示8个字符宽的空间中的UUID。您可能可以复制并粘贴这些,但需要小心移动它们 - 手动输入它们将具有挑战性。

答案 6 :(得分:0)

使用Apache Commons的另一个最佳选择

UIView.animate(withDuration: 0.3, animations: { [unowned self] in
        self.picker.isHidden = !open
        self.layoutIfNeeded()
    })
上面的代码将生成一个随机字符串。 输出:ZBgTxJX93f

参考:https://www.mkyong.com/java/java-how-to-generate-a-random-string/

答案 7 :(得分:0)

GUID / UUID是一个128位数字,通常表示为一系列32个HEX值。十六进制值是16位。如果要用16位数字表示相同的128位值,则需要使用64位数字。

为此,您需要创建一个类似于十六进制值映射方式的映射。英文字母有26个字符,而ASCII则有一个大写和小写的值。这给了我们52个不同的数字。再加上0到9的数值,使我们达到62。然后,您可以选择要升至64的任何值,例如“ *”和“ +”,或者考虑到它们在ASCII中的位置,最有意义的选择表。因此,您将创建一个在这64位数字之间转换以建立128位值的查找表。

这应该为您提供完整的128位值,以16个Base-64字符表示。它看起来像: GaUvr * olp42xgtyu

请注意,这不是标准的,您需要同时控制编码器和解码器。