package com.eas.client; /** * * @author mg */ public class IdGenerator { private static final long COUNTER_DIGITS = 100; private static long ID = System.currentTimeMillis() * COUNTER_DIGITS; private static final long LONG_COUNTER_DIGITS = 1000000; private static long LONG_ID = System.currentTimeMillis() * LONG_COUNTER_DIGITS; public static double genId() { // Note! Truncation of fractional part is here. long idMillis = ID / COUNTER_DIGITS; if (idMillis == System.currentTimeMillis()) { long oldCounter = ID - idMillis * COUNTER_DIGITS; long newCounter = oldCounter + 1; if (newCounter == COUNTER_DIGITS) { // Spin with maximum duration of one millisecond ... long newMillis; do { newMillis = System.currentTimeMillis(); } while (newMillis == idMillis); ID = newMillis * COUNTER_DIGITS; } else { ID = idMillis * COUNTER_DIGITS + newCounter; } } else { ID = System.currentTimeMillis() * COUNTER_DIGITS; } return ID; } public static String genLongId() { // Note! Truncation of fractional part is here. long idMillis = LONG_ID / LONG_COUNTER_DIGITS; if (idMillis == System.currentTimeMillis()) { long oldCounter = LONG_ID - idMillis * LONG_COUNTER_DIGITS; long newCounter = oldCounter + 1; if (newCounter == LONG_COUNTER_DIGITS) { // Spin with maximum duration of one millisecond ... long newMillis; do { newMillis = System.currentTimeMillis(); } while (newMillis == idMillis); LONG_ID = newMillis * LONG_COUNTER_DIGITS; } else { LONG_ID = idMillis * LONG_COUNTER_DIGITS + newCounter; } } else { LONG_ID = System.currentTimeMillis() * LONG_COUNTER_DIGITS; } return String.valueOf(LONG_ID); } }