我尝试过UUID并生成32个字符串。但我想要16个字符的唯一字符串
答案 0 :(得分:0)
然后不要使用UUID。
您可以从long
生成一个16个字符的十六进制字符串。
首先生成long
:
long
计数器(以确保生成的标识符是唯一的)long
- 冒着获得重复值的风险。 k
位(k < 64
),并将这些位连接到唯一编号的64-k
位从一些柜台获得。获得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
请注意,这不是标准的,您需要同时控制编码器和解码器。