Closed zlywq closed 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") }
@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
我无语
在uid_test.go的TestSnowFlake里面加对prevId的比较,保证递增,一会就出现了