public long nextLargeGapId() {
        // prepare each part of ID
        long sequenceNum = sequenceNumber.incrementAndGet() & SEQUENCE_NUMBER_MASK;
        long timestamp = lastTimestamp.updateAndGet(now -> {
            // Don't let timestamp go backwards at least while this JVM is running.
            long nonBackwardsTimestamp = Math.max(now, System.currentTimeMillis());
            if (sequenceNum == 0) {
                // Always force the clock to increment whenever sequence number is 0,
                // in case we have a long time-slip backwards
                nonBackwardsTimestamp++;
            }
            return nonBackwardsTimestamp;
        }) - EPOCH;

        // Get ID
        return (sequenceNum << (TIMESTAMP_BITS + DATA_CENTER_ID_BITS + WORKER_ID_BITS))
                | (timestamp << (DATA_CENTER_ID_BITS + WORKER_ID_BITS))
                | (dataCenterId << WORKER_ID_BITS) | workerId;
    }
1. The purpose of generating IDs with large gaps is to generate shard keys in a large range
so that MongoDB can split them into a lot of chunks to distribute them to different MongoDB
servers 2. To avoid generating monotonical IDs to guarantee even distribution of data across
the sharded cluster
turms-server-common/src/main/java/im/turms/server/common/infra/cluster/service/idgen/SnowflakeIdGenerator.java