2013-12-19 108 views
0

如何生成唯一字母數字字符串,其中固定長度爲,共8個字符。我希望將它基於Id +當前時間。
我嘗試了MD5,但它使字符串太長固定長度的唯一字母數字字符串

謝謝!

+0

任何企圖從你身邊? –

+1

你是什麼意思的獨特? – Bathsheba

+1

如何獲取MD5哈希的首個或最後8個字符? (或者像SHA1,SHA256等任何其他散列...) – bgamlath

回答

2

問題是,8個字母數字字符很可能太少,以保證唯一性...使用該方法。

你只需要做一些算術。將您的應用程序每秒可生成的ids數乘以應用程序預期「活」的預期秒數。現在計算出你需要多少個字母數字字符來編碼這個數字......這會給你多大的id的「timestamp」部分。然後添加字符串「id」部分的字符。

IMO,最好的辦法(如果你必須使用短的字符串)是產生部分或完全隨機的字符串,然後檢查他們對所有以前發出的id字符串的(大)表。如果遇到碰撞,請生成另一個字符串,然後重複。


如果你還希望你的id很難預測(根據你的評論),那麼「隨機數」方法是最好的。確保您使用密碼質量的RNG或PRNG。基於時間戳的方法存在的問題是生成的id將更容易預測...或猜測。

1

使用java.util.UUID

UUID uuid = UUID.randomUUID(); 
String id = uuid.toString().substring(0, 8); 
+2

隨機UUID的子字符串具有更高的非唯一性概率。在這種情況下,只有'16^8' =='2^32'可能的值。這意味着每個ID有40億的先前產生的可能性。這可能會高得令人無法接受......除非你做了其他檢查。 –

1

字符串不能是唯一的:獨特性是指一個項目在收集的背景下沒有重複,稱爲設置。給定一組符號(在你的問題中你說的是字母數字)和一個字符串長度(在你的例子8中)有一個已知數量的可能的組合,這可能或可能不足以滿足你的需求。

您的要求不能滿足(至少與您提供的信息不符)。如果你真的想令牌是唯一的給定的輸入(ID,時間戳)保證是關鍵(即對於每個給定的ID,你永遠不會有兩個或更多相同的時間戳),只需將ID和時間戳並排。

ID列的大小將是用戶名的最大大小+時間戳的固定大小。

相關問題