2014-03-12 118 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的集合。您可以通過以任意原始方式生成一個「隨機」數字,然後將其與所有現有數字進行匹配來使用它。如果它碰撞,生成另一個。

相關問題