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);