一个实现 Twitter SnowFlake 算法 的 Go 分布式 UID 生成器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
zhengji
V2EX    分享创造

一个实现 Twitter SnowFlake 算法 的 Go 分布式 UID 生成器

  •  
  •   zhengji
    zheng-ji 2016 年 3 月 6 日 4401 次点击
    这是一个创建于 3598 天前的主题,其中的信息可能已经有所发展或是发生改变。

    根据 Twitter SnowFlake 算法, 实现的分布式线程安全 UID 生成器

    源码地址:https://github.com/zheng-ji/goSnowFlake

    goSnowFlake

    Feature

    • 线程安全的 UID 生成器
    • 绿色可插拔,无需依赖 Redis,Mysql,无状态
    • 适合分布式系统
    • 实现 Twitter SnowFlake 理论

    Description

    0 41 51 64 +---------------+----------------+-----------+ |timestamp(ms) | worker node id | sequence | +---------------+----------------+-----------+ id = timestamp | workerid | sequence (eg. 1451063443347648410) 

    由三部分与运算组合而成,分别是毫秒级别的时间戳,机器 workerid, 以及为了解决冲突的序列号

    Installation

    go get github.com/zheng-ji/goSnowFlake 

    Example

    import ( "fmt" "github.com/zheng-ji/goSnowFlake" ) func main() { // Params: Given the workerId, 0 < workerId < 1024 iw, err := goSnowFlake.NewIdWorker(1) if err!= nil { fmt.Println(err) } for i := 0; i < 100; i++ { if id, err := iw.NextId(); err != nill { fmt.Println(id) } } } 

    Documentation

    14 条回复    2016-03-17 11:09:58 +08:00
    barbery
        1
    barbery  
       2016 年 3 月 6 日
    好像很犀利的样子
    forsigner
        2
    forsigner  
       2016 年 3 月 6 日
    这个 UID 跟 GUID 和 UUID 有什么区别?
    JiShuTui
        3
    JiShuTui  
       2016 年 3 月 6 日   1
    @forsigner 你了解一下 Twitter SnowFlake 就知道了
    leedstyh
        4
    leedstyh  
       2016 年 3 月 6 日   1
    不错, star 了,目前把`mgo`里面的 ObjectID 的算法提出来了在用,下个项目试试这个!
    forsigner
        5
    forsigner  
       2016 年 3 月 6 日
    @JiShuTui 好的哈
    zieglar
        6
    zieglar  
       2016 年 3 月 6 日   1
    似乎无法反推是哪个 worker 生成的?
    sakeven
        7
    sakeven  
       2016 年 3 月 6 日   1
    // Listen and Server in 0.0.0.0:8080
    r.Run(":8182")

    注释和写的不一样 - -
    zhengji
        8
    zhengji  
    OP
       2016 年 3 月 6 日
    @sakeven 恩恩多谢,已改
    zhengji
        9
    zhengji  
    OP
       2016 年 3 月 8 日
    @zieglar 这个是不能反推的
    devtiange
        10
    devtiange  
       2016 年 3 月 9 日
    @zhengji 问一下为什么不能反推? 取出 worker node 那段不行吗?
    zhengji
        11
    zhengji  
    OP
       2016 年 3 月 9 日
    @devtiange 毫秒时间戳,以及序列号你都是不知道的 ,就类似三元一次方程里面, 3 个未知数,我的理解是,无法求解, x+y+z = A
    devtiange
        12
    devtiange  
       2016 年 3 月 10 日   1
    @zhengji 从你的描述上来看, worker node 的信息是在 41 - 51 位.
    我从 64bit 里拿出这 10 位, 不就能知道 worker node 了吗? 不知道是哪里理解的不对?
    zhengji
        13
    zhengji  
    OP
       2016 年 3 月 11 日
    @devtiange sorry,我理解错你的意思了,你这样说是对的。可以递推回的。
    leedstyh
        14
    leedstyh  
       2016 年 3 月 17 日
    `ts - CEpoch<<CTimeStampShift | iw.workerId<<CWorkerIdShift | iw.sequence`

    这段和 Twitter 原来的算法不太一样呢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1071 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 17:59 PVG 01:59 LAX 09:59 JFK 12:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86