## goSnowFlake

[![Build Status](https://travis-ci.org/zheng-ji/goSnowFlake.svg)](https://travis-ci.org/zheng-ji/goSnowFlake)
[![GoDoc](https://godoc.org/github.com/zheng-ji/goSnowFlake?status.svg)](https://godoc.org/github.com/zheng-ji/goSnowFlake)

A threadsafe unique ID generator inspired by Twitter SnowFlake theory

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

![goSnowFlake](https://github.com/zheng-ji/goSnowFlake/blob/master/logo/snowflake.png)

Feature
--------

* ThreadSafe unique id generator
* Green pluggable, without external storage like Redis or MySQL
* Suitable for distributed systems
* Implement Twitter's SnowFlake theory


Description
-----------


```
+---------------+----------------+----------------+
|timestamp(ms)42  | worker id(10) | sequence(12)  |
+---------------+----------------+----------------+

id  = timestamp | workerid | sequence (eg. 1451063443347648410)

```

An unique ID contains 3 parts:

* a timestamp in nanosecond
* a worker ID
* a sequence number


Installation
-------------

```
go get github.com/zheng-ji/goSnowFlake
```

Example
-------

```go
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 != nil {
            fmt.Println(err)
        } else{
            fmt.Println(id)
        }
	}
}
```

Documentation
-------------

- [Twitter Blog Reference](https://blog.twitter.com/2010/announcing-snowflake)
- [Reddit Discuss](https://www.reddit.com/comments/cajap/twitter_announces_snowflake_a_distributed_unique/)

License
-------

Copyright (c) 2016 by [zheng-ji](http://zheng-ji.info) released under MIT License.

