Necesito para crear una marca de tiempo (en milisegundos) en Java que va a ser única en particular que la de VM de la instancia. I. e. necesita alguna manera de limitar el rendimiento del Sistema.currentTimeMillis() para que devuelva a lo más uno de los resultados de cada ms. Alguna idea sobre cómo implementar eso?

No estoy seguro de a qué te refieres la limitación de currentTimeMillis() para que devuelva en cada uno de los resultados ms? Si desea único marcas de tiempo, sería más bien como a la garantía que se devuelve un valor diferente en cada llamada, ¿verdad?
¿Tienen que ser monótona creciente? ¿Que tiene que soportar cualquier tipo de relación con el real ? ¿Tienen que ser único a través de múltiples pistas en todos?

OriginalEl autor Yrlec | 2012-02-08

5 Comentarios

  1. 34

    Esto le dará un tiempo tan cerca de la hora actual como sea posible sin duplicados.

    private static final AtomicLong LAST_TIME_MS = new AtomicLong();
    public static long uniqueCurrentTimeMS() {
        long now = System.currentTimeMillis();
        while(true) {
            long lastTime = LAST_TIME_MS.get();
            if (lastTime >= now)
                now = lastTime+1;
            if (LAST_TIME_MS.compareAndSet(lastTime, now))
                return now;
        }
    }

    Una forma de evitar la limitación de un id por mili-segundo es el uso de un micro-segundo tiempo. es decir, multiplicar currentTimeMS por 1000. Esto permitirá a los 1000 id por mili-segundo.

    Nota: si el tiempo va hacia atrás, por ejemplo, debido a la NTP corrección, el tiempo se acaba progreso en 1 mili-segundo por la invocación hasta la hora de las capturas. 😉

    Gracias! Exactamente lo que necesitaba!
    Utilizado correctamente, esto significa que usted tendrá identificadores únicos, incluso después de reiniciar la aplicación.
    Suena bien! ¿Qué significa «se usa correctamente» significa más precisamente?
    No exceder de un promedio de 1 por mili-segundo o 1000 por mili-segundo (dependiendo de lo que su múltiple es) de Esta manera por el momento de reiniciar, el identificador será mayor que el último id utilizado antes de que la aplicación se detuvo. Dado que usted puede hacer que el factor de que cualquier cosa que usted desea, esto no debería ser un problema. Yo uso un nano-tiempo básicos de identificación. 😉

    OriginalEl autor Peter Lawrey

  2. 4

    Puede utilizar System.nanoTime() para una mejor precisión

    Aunque traté de abajo y cada vez que da valores diferentes, es probable que no se garantiza la única de todo el tiempo.

    public static void main(String[] args) {
            long time1 = System.nanoTime();
            long time2 = System.nanoTime();
            long time3 = System.nanoTime();
            System.out.println(time1);
            System.out.println(time2);
            System.out.println(time3);
        }

    Otra manera es usar AtomicInteger/AtomicLong clases de números únicos a los que si el tiempo no es importante para usted y usted sólo necesita único número, esto probablemente es un btter elección.

    nanoTime es monótona, pero no siempre es único. Usted puede conseguir un montón de duplicados. por ejemplo, en Red Hat & Centos 5.x la resolución es de micro-segundo, así que usted consigue un montón de valores repetidos.
    Gracias por la info. Supuse que depende del sistema operativo y la máquina.
    Usted puede utilizar nanoTime con un cheque que sus diferentes. (Similar a mi de la solución) La nanoTime es el tiempo de actividad en el ano-segundos en muchos sistemas.
    De acuerdo, ya upvoted su respuesta y comentarios.
    +1: Hacer de la misma para que la respuesta la puede utilizar nanoTime con AtomicLong (no AtomicInteger)

    OriginalEl autor fmucar

  3. 2

    Mientras que la búsqueda de una solución que se me vino a través de ULIB
    (Único Universal Lexicográficamente Ordenable Identificador)
    https://github.com/huxi/sulky/tree/master/sulky-ulid/

    No es mucho, pero más corto que el UUID.

    UN ULID:

    • Es compatible con UUID/GUID
      1.21 e+24 única ULIDs por milisegundo (1,208,925,819,614,629,174,706,176 para ser exactos)
    • Lexicográficamente ordenable
    • Canónicamente codificado como un 26 cadena de caracteres, frente a los 36 de carácter UUID
    • Utiliza Crockford del base32 para mejorar la eficiencia y la legibilidad (5 bits por carácter)
    • No distingue mayúsculas de minúsculas
    • Ni caracteres especiales (URL de la caja fuerte)

    OriginalEl autor Marian Venin

  4. 1

    Usted podría utilizar System.nanoTime(), que es la más precisa disponible temporizador del sistema, y se divide por millones para obtener milisegundos. Si bien no existen garantías formales en ¿con qué frecuencia se actualiza, creo que es razonable suponer que se actualiza de manera más (orden(s) de magnitud) con frecuencia de una vez por milisegundo. Por supuesto, si usted cree entero marcas de tiempo de menos de un milisegundo intervalo, entonces no todos pueden ser únicos.

    Tenga en cuenta que el valor absoluto nanoTime() es arbitraria. Si desea que el tiempo absoluto, calibrar de alguna manera, es decir, comparar a currentTimeMillis() al inicio.

    OriginalEl autor Joonas Pulakka

Dejar respuesta

Please enter your comment!
Please enter your name here