回答
問題是,8個字母數字字符很可能太少,以保證唯一性...使用該方法。
你只需要做一些算術。將您的應用程序每秒可生成的ids數乘以應用程序預期「活」的預期秒數。現在計算出你需要多少個字母數字字符來編碼這個數字......這會給你多大的id的「timestamp」部分。然後添加字符串「id」部分的字符。
IMO,最好的辦法(如果你必須使用短的字符串)是產生部分或完全隨機的字符串,然後檢查他們對所有以前發出的id字符串的(大)表。如果遇到碰撞,請生成另一個字符串,然後重複。
如果你還希望你的id很難預測(根據你的評論),那麼「隨機數」方法是最好的。確保您使用密碼質量的RNG或PRNG。基於時間戳的方法存在的問題是生成的id將更容易預測...或猜測。
UUID uuid = UUID.randomUUID();
String id = uuid.toString().substring(0, 8);
隨機UUID的子字符串具有更高的非唯一性概率。在這種情況下,只有'16^8' =='2^32'可能的值。這意味着每個ID有40億的先前產生的可能性。這可能會高得令人無法接受......除非你做了其他檢查。 –
字符串不能是唯一的:獨特性是指一個項目在收集的背景下沒有重複,稱爲設置。給定一組符號(在你的問題中你說的是字母數字)和一個字符串長度(在你的例子8中)有一個已知數量的可能的組合,這可能或可能不足以滿足你的需求。
您的要求不能滿足(至少與您提供的信息不符)。如果你真的想令牌是唯一的和給定的輸入(ID,時間戳)保證是關鍵(即對於每個給定的ID,你永遠不會有兩個或更多相同的時間戳),只需將ID和時間戳並排。
ID列的大小將是用戶名的最大大小+時間戳的固定大小。
- 1. 固定長度字符串的數字
- 2. 生成長度爲6的唯一非順序字母數字字符串
- 3. 生成字母/數字串具有固定長度
- 4. 拆分固定長度的字符串
- 5. C#中固定長度的字符串
- 6. 字符串的固定長度排列
- 7. C++ stringstream將固定長度字符串讀入字符數組
- 8. 按固定長度分割字符串
- 9. 如何在固定長度字符串中對齊字符串
- 10. 從另一個太長的唯一數值創建一個固定長度的唯一字符串
- 11. 如何返回一個固定長度的字符串一個字符串的?
- 12. 哪裏是空字符的固定長度的空字符串?
- 13. 將可變長度字符串分配給固定長度字符串
- 14. 字母數字在PHP中增加一個字符串(一定長度)
- 15. Informatica中的固定長度字母數字生成
- 16. 將字符串轉換爲固定長度的一組數組
- 17. 從給定字符生成等長的固定長度的隨機字符串
- 18. 如何從長度爲28的兩個唯一字符串中生成長度爲28的唯一字符串?
- 19. 在excel中爲字母數字字符串指定一個唯一的整數
- 20. 正則表達式:固定長度字母后跟數字
- 21. 任意字符串到常量長度小寫字母數字字符串
- 22. 從字母數字字符串創建唯一整數
- 23. 創建一個唯一的字母數字10個字符的字符串
- 24. 檢查字符串具有一定的長度,含有一定的字母
- 25. 計算字符串中最小長度的唯一字
- 26. R:創建具有固定長度數字的字母數字序列
- 27. C#長字符轉換的字母數字字符串
- 28. 生成字母數字標識(唯一字符串)
- 29. 從字母數字字符串生成唯一標識
- 30. 字符串的長度比字符串的長度長
任何企圖從你身邊? –
你是什麼意思的獨特? – Bathsheba
如何獲取MD5哈希的首個或最後8個字符? (或者像SHA1,SHA256等任何其他散列...) – bgamlath