2014-03-12 76 views
1

我需要创建长度为7或10的字母数字唯一ID。类似于较短版本的Git落实ID (7a471b2)如何创建7个字符的字母数字唯一ID?

我试过UUID,但生成的唯一ID比我需要的更长。

Java中有内置的方法/代码片段可以帮助吗?

+0

剪下您生成的唯一ID。 – Maroun

+4

@MarounMaroun我认为它可能会创建重复的ID –

+0

@Maroun,但可能会发生碰撞,我不希望这样。 – Veera

回答

0

尝试的Apache郎RandomStringUtils类

0

这并不像它看起来那样简单。首先UUID不是100%唯一的。 它只能产生2^128个唯一的数字(我可能对128数字错误,但你明白了)。

缩短它只会增加重复的概率。

我现在想到的最好的方法是取UUID并在其上使用一些base64编码器。

[编辑]或者,使用Random.nextInt并每次需要一个新的ID时加1。

+0

在64位编码的16字节永远不会给你7到10的长度 – chiccodoro

+0

我的意思是通过base 64编码器得到byte [],然后根据需要使用更少的字节。 – Hirak

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

您没有提及您是否需要以无状态方式生成号码。如果您有许多来源生成ID,而您的每个来源都是独立的,并且不知道任何其他来源的状态,则只需要这一点。对于这种情况,UUID允许生成仍然不太可能发生冲突的ID。

如果你是生成ID的唯一源码,那么你可以利用状态。例如,在数据库中,您通常只需使用一个序列来生成ID(即序列的下一个状态)。这些数字也非常独特。如果您需要随机查看,则有算法通过将每个连续号码映射到一个随机数字上来对数字空间进行洗牌。

“状态”的第二个例子是已经使用的所有ID的集合。您可以通过以任意原始方式生成一个“随机”数字,然后将其与所有现有数字进行匹配来使用它。如果它碰撞,生成另一个。

相关问题