JSFiddle - React, Tailwind, and code Playground
by zainshaikh
JavaScript
var datacenterId = 1;
var workerId = 1;
var sequence = 0;
var twepoch = 1288834974657
var workerIdBits = 5
var datacenterIdBits = 5
var maxWorkerId = -1 ^ (-1 << workerIdBits)
var maxDatacenterId = -1 ^ (-1 << datacenterIdBits)
var sequenceBits = 12
var workerIdShift = sequenceBits
var datacenterIdShift = sequenceBits + workerIdBits
var timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits
var sequenceMask = -1 ^ (-1 << sequenceBits)
var lastTimestamp = -1;
function timeGen() {
return new Date().getTime()
}
function tilNextMillis(lastTimestamp) {
var timestamp = timeGen()
while (timestamp <= lastTimestamp) {
timestamp = timeGen()
}
return timestamp
}
function nextId() {
var timestamp = timeGen()
if (lastTimestamp == timestamp) {
sequence = (sequence + 1) & sequenceMask
if (sequence == 0) {
timestamp = tilNextMillis(lastTimestamp)
}
} else {
sequence = 0
}
lastTimestamp = timestamp
return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence
}
setInterval(function(){
console.log(nextId());
}, 1000);