zheng-ji / goSnowFlake

一个实现 Twitter SnowFlake 算法 的 Go 分布式 UID 生成器.A threadsafe unique ID generator inspired by Twitter SnowFlake theory
MIT License
364 stars 75 forks source link

有bug,连续递增测试很快就不行 #6

Closed zlywq closed 8 years ago

zlywq commented 8 years ago

在uid_test.go的TestSnowFlake里面加对prevId的比较,保证递增,一会就出现了

zheng-ji commented 8 years ago

你测试的代码可以看看吗

zlywq commented 8 years ago

func TestSnowFlake(t *testing.T) { fmt.Println("start generate") iw, _ := NewIdWorker(2) var prevId int64 = 0 for i := 0; i < 1000; i++ { id, err := iw.NextId() if err != nil { fmt.Println(err) } else { //fmt.Println(id) } if prevId >= id { panic("prevId >= id") } else { prevId = id } } fmt.Println("end generate") }

zheng-ji commented 8 years ago

@zlywq 你好,感谢你的issue。 从测试代码中看,你通过测试id不是递增的方式,来判断它是有bug,这个理解和snowflake算法的初衷不一致。

snowflake的算法,在前2个部分(id,ts)都相等的情况下会用最后一部分来解决冲突。 测试案例中,产生的1000个id并没有重复,所以这是一个uid算法, 并不是保证每一个id都是严格递增的。

func TestSnowFlake(t *testing.T) {
        fmt.Println("start generate")
        iw, _ := NewIdWorker(2)
        var prevId int64 = 0
        for i := 0; i < 1000; i++ {
                 id, err := iw.NextId()
                if err != nil {
                        fmt.Println(err)
                } else {
                          fmt.Println(id)
                }
                if prevId >= id {
                       //panic("prevId >= id")
                       fmt.Println("prevId >= id")
                } else {
                          prevId = id
                }
        }
        fmt.Println("end generate")
}
go test . > result
产生的1000个id,进行排重,没有重复
cat result | grep 14 | sort -u | wc -l 
zlywq commented 8 years ago

我无语