packagemainimport("fmt""time")const(TIMESTAMP_LEFT_SHIFT=5TIMESTAMP_MASK=0x1FMACHINE_ID_LEFT_SHIFT=41MACHINE_ID_MASK=0x7FFSEQUENCE_LEFT_SHIFT=12SEQUENCE_MASK=0xFFF)var(lastTimestamp=uint64(0)machineId=uint64(0)sequence=uint64(0))funcsnowflakeNextId()uint64{timestamp:=uint64(time.Now().UnixNano()/1e6)iftimestamp<lastTimestamp{fmt.Println("Clock moved backwards. Refusing to generate id.")return0}iftimestamp==lastTimestamp{sequence=(sequence+1)&SEQUENCE_MASKifsequence==0{timestamp=(timestamp+1)&TIMESTAMP_MASKiftimestamp==0{machineId=(machineId+1)&MACHINE_ID_MASKifmachineId==0{fmt.Println("Failed to generate unique machine id.")return0}}}}else{sequence=0}lastTimestamp=timestampreturn((timestamp<<TIMESTAMP_LEFT_SHIFT)|(machineId<<MACHINE_ID_LEFT_SHIFT)|(sequence<<SEQUENCE_LEFT_SHIFT))}funcmain(){id:=snowflakeNextId()fmt.Printf("Generated id: %d\n",id)}
importtimeimportstructclassSnowFlake:def__init__(self):self.machine_id=0self.sequence=0self.last_timestamp=0defget_next_id(self):timestamp=int(time.time()*1000)iftimestamp<self.last_timestamp:raiseValueError('Clock moved backwards.')iftimestamp==self.last_timestamp:self.sequence=(self.sequence+1)&0xfffelse:self.sequence=0self.last_timestamp=timestampmachine_id=struct.pack('>H',self.machine_id)returnstruct.unpack('>Q',machine_id+struct.pack('>L',timestamp-self.last_timestamp)+struct.pack('>H',self.sequence))[0]if__name__=='__main__':snowflake=SnowFlake()foriinrange(10):print(snowflake.get_next_id())