|
- /*
- * 版权属于:yitter(yitter@126.com)
- * 开源地址:https://github.com/yitter/idgenerator
- */
- module gen
-
- import contract
- import core
- import time
-
- pub struct DefaultIdGenerator {
- mut:
- options &contract.IdGeneratorOptions
- snow_worker &contract.ISnowWorker
- }
-
- pub fn make_generator(options &contract.IdGeneratorOptions) &DefaultIdGenerator {
- min_time := i64(631123200000)
- if options.base_time < min_time || options.base_time > time.now().unix_time_milli() {
- panic('base_time error.')
- }
-
- if options.seq_bitlength + options.workerid_bitlength > 22 {
- panic('error:workerid_bitlength + seq_bitlength <= 22')
- }
-
- max_workerid_number := 1 << options.workerid_bitlength - 1
- if options.worker_id > max_workerid_number {
- panic('WorkerId error. (range:[1, ' + max_workerid_number.str() + ']')
- }
-
- if options.seq_bitlength < 2 || options.seq_bitlength > 21 {
- panic('seq_bitlength error. (range:[2, 21])')
- }
-
- max_seqnumber := 1 << options.seq_bitlength - 1
- if options.max_seqnumber > max_seqnumber {
- panic('MaxSeqNumber error. (range:[1, ' + max_seqnumber.str() + ']')
- }
-
- if options.min_seqnumber > max_seqnumber {
- panic('MinSeqNumber error. (range:[1, ' + max_seqnumber.str() + ']')
- }
-
- match options.method {
- 1 {
- return &DefaultIdGenerator{
- options: options
- snow_worker: core.make_sf_m1(options)
- }
- }
- 2 {
- return &DefaultIdGenerator{
- options: options
- snow_worker: core.make_sf_m2(options)
- }
- }
- else {
- return &DefaultIdGenerator{
- options: options
- snow_worker: core.make_sf_m1(options)
- }
- }
- }
- }
-
- pub fn (mut dig DefaultIdGenerator) new_long() u64 {
- return dig.snow_worker.next_id()
- }
|