我需要创建长度为7或10的字母数字唯一ID。类似于较短版本的Git提交ID (7a471b2)
。
我尝试过UUID,但生成的唯一ID比我需要的时间长。
Java中是否有内置的方法/代码片段可以提供帮助?
答案 0 :(得分:1)
如果要生成随机值,则应使用SecureRandom
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[15];
random.nextBytes(bytes);
要获得正确的密钥长度,您可能希望将其转换为预期的密钥长度。字符也是数字,因此您可以生成更长的random
值,然后对其进行编码。您可能希望使用Base64或hext。在Java中,您使用DatatypeConverter
String key = DatatypeConverter.printBase64Binary(random)
;
我们使用Apache
org.apache.commons.codec.binary.Base64
String key = new String(Base64.encodeBase64(random));
没有Java类支持以该形式生成随机值。
答案 1 :(得分:1)
您没有提及是否需要以无状态方式生成数字。如果您有许多生成ID的源,而您的每个源都是独立的,并且不知道任何其他源的任何状态,则只需要这个。对于这种情况,UUID允许生成仍然不太可能发生冲突的ID。
如果您是唯一生成ID的源,那么您可以使用状态。例如,在数据库中,您通常只使用序列来生成ID(状态是序列的下一个)。这些数字也非常独特。如果你需要随机“查看”,有一些算法可以通过将每个序列号映射到一个随机数字来改变数字空间。
“州”的第二个例子是已经使用的所有ID的集合。您可以通过以任意原始方式生成“随机”数字,然后将其与所有现有数字进行匹配来使用此功能。如果碰撞,则生成另一个。
答案 2 :(得分:0)
尝试Apache lang RandomStringUtils类
答案 3 :(得分:0)
这并不像看起来那么简单。首先,UUID并非100%独特。 它只能产生2 ^ 128个唯一数字(我可能错误的是128号。但你明白了。)
缩短时间只会增加重复的可能性。
我现在想到的最好方法是使用UUID并在其上使用一些base64编码器。
[编辑]或者,使用Random.nextInt并在每次需要新ID时加1。