如何生成全域性唯一標識

2022-05-10 21:08:04 字數 1381 閱讀 2693

其實這事說簡單點, 不就是要為每個使用者都配乙個數字麼? 而且這個數字必須是之前沒有用過的. 那簡單了, 數數就完了唄, 123456往下數, 來乙個發乙個記乙個.

如何實現? mysql主鍵自增, 或者redis記乙個key, 每次incr自增. 什麼? qq號從1開始太醜了? 簡單, 自增設置乙個起始id.

完美, 實現方案簡單粗暴, 而且不會出現重複.

使用時間戳. 使用當前時間戳來生成, 比如:1585390459這樣的數字. 但是時間戳是以秒為單位的, 如果一秒發生了多次請求, 那不就重複了麼?  我想了想, 有乙個簡單到爆的處理方法, 在後面再拼上0000-9999的隨機數, 這樣每秒有一萬個不重複的, 重複的概率就降低了, 在生成後還需要查詢是否已經存在, 若存在則重複生成.

說起來, 要生成這樣的隨機id, 總要有乙個地方來記錄已生成的進度, 如果完全隨機生成的話, 就不可避免的需要回查是否存在. 記錄生成進度的可以有很多: redis、mysql等等. 或者可以存在乙個發號器, 所有的id都有它來生成, 不停的生成, 供其他請求分配使用, 就是乙個生產者消費者.

通過想了幾種方案, 發現了一些規律.

要想生成隨機id, 首先, 要有乙個不是隨機的而又是當前唯一持有的. 在這個前提下, 再各種添油加醋, 生成最終的id. 就算你要呼叫隨機函式, 也得設定乙個隨機種子不是? 莫非這就是傳說中的以不變應萬變..

很好, 那麼現在問題就歸結為, 如何給每個使用者都配乙個唯一標識

1.數數

直接想到的方案, 從1開始, 慢慢往後數, 而這個過程可以借助mysql的主鍵自增, 也可以借助redis的單執行緒優勢. 等等吧,

2.使用者特徵

可以根據不同使用者的特徵, 如使用者的地域、性別、生辰等等, 來生成每個人的唯一標識, 此舉可以參考身份證號碼的生成, 每個人都是不一樣的

3.當前機器特徵

找到執行**時的特定特徵, 如: mac位址、時間戳、機器編號、執行緒id等等

4.**執行次數

執行緒共享變數, 每次執行則+1.

等等等等

簡單想下來, 其實重要的是找到其中每次生成都和別人不一樣的那個點, 然後拿來稍作加工即可. 有點找不同的趕腳. 對了, 在網上看到了twitter的雪花演算法, 基本也是找不同的思路. 關鍵就在於你是否能從各種功能繁雜的資訊中找到那個不同的點. 如果實在找不到不同, 就只能人為的賦予他們不同了(自增id等).

現在已經有很多任務具了, uuid, mongodb的objectid等, 基本可以拿來直接使用.

如何生成全域性唯一標識

其實這事說簡單點,不就是要為每個使用者都配乙個數字麼?而且這個數字必須是之前沒有用過的.那簡單了,數數就完了唄,123456往下數,來乙個發乙個記乙個.如何實現?mysql主鍵自增,或者redis記乙個key,每次incr自增.什麼?qq號從1開始太醜了?簡單,自增設置乙個起始id.完美,實現方案簡...

生成全域性唯一ID

a庫 b庫 c庫支援同時寫入 a庫初始值為1,自增為3,獲取的值一次是1 4 7 b庫初始值為2,自增為3,獲取的值一次是2 5 8 c庫初始值為3,自增為3,獲取的值一次是6 6 9 獲取id時可從三庫輪詢獲取 此方法使用資料庫原有的功能,所以相對簡單 能夠保證唯一性 能夠保證遞增性 id 之間的...

C 生成全域性唯一Guid

在軟體開發中,我們經常需要乙個唯一標識來標識乙個物件,在 php中,可以用uuid來獲得全域性唯一的id,其實c 也內建了簡單的guid獲得辦法,猜想guid應該是本機的特徵以及執行的時間的乙個雜湊值,所以幾乎可以保證不會重複,如下 guid include include 生成guid const...