Necesito crear una marca de tiempo (en milisegundos) en Java que garantice ser única en esa instancia de VM en particular. Es decir. necesita alguna forma de acelerar el rendimiento de System.currentTimeMillis() para que devuelva como máximo un resultado cada ms. ¿Alguna idea sobre cómo implementar eso?Creación de una marca de tiempo única en Java
Respuesta
Esto 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 una identificación por mili-segundo es utilizar una marca de tiempo micro-segunda. es decir, multiplicar CurrentTimeMS por 1000. Esto permitirá 1000 ids por mili-segundo.
Nota: si el tiempo va hacia atrás, por ejemplo, debido a una corrección NTP, el tiempo simplemente progresará a 1 milisegundo por invocación hasta que el tiempo llegue. ;)
Puede usar System.nanoTime()
, que es el temporizador de sistema más preciso disponible, y dividirlo por millones para obtener milisegundos. Si bien no hay garantías formales sobre la frecuencia con que se actualiza, creo que es razonable suponer que se actualiza mucho más (orden (es) de magnitud) con frecuencia que una vez por milisegundo. Por supuesto, si crea marcas de tiempo enteras en menos de un intervalo de milisegundos, entonces no todas pueden ser únicas.
Tenga en cuenta que el valor absoluto nanoTime()
es arbitrario. Si desea tiempo absoluto, calibre de alguna manera, es decir, compárelo con currentTimeMillis()
al comenzar.
Puede utilizar System.nanoTime()
para una mayor precisión
Aunque traté de abajo y cada vez que se da valores diferentes, es probable que no se garantiza que sea único en todo momento.
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 forma es utilizar AtomicInteger
/AtomicLong
clases de números únicos si el tiempo no es importante para usted y sólo tiene número único, esto probablemente es una opción btter.
nanoTime es monótono, pero no siempre único. Puedes obtener muchos duplicados. p.ej. en Red Hat y Centos 5.x la resolución es de micro segundos, por lo que obtienes muchos valores repetidos. –
Gracias por la información. Supuse que depende del sistema operativo y la máquina. – fmucar
Puede usar nanoTime con un control que sea diferente. (Similar a mi solución) El nanoTime es el tiempo de actividad en segundos en muchos sistemas. –
¿Podría quizás hacer uso de java.util.UUID
y es timestamp()
y clockSequence()
?
Method Summary
int clockSequence()
The clock sequence value associated with this UUID.
long timestamp()
The timestamp value associated with this UUID.
Más detalles aquí: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html
bien la búsqueda de una solución me encontré con ULIB (único universal lexicográfico Sortable Identificador) https://github.com/huxi/sulky/tree/master/sulky-ulid/
No es mucho, pero más corto entonces UUID.
Un Ulid:
- es compatible con UUID/GUID de 1.21e + 24 ULIDs únicas por milisegundo (1,208,925,819,614,629,174,706,176 para ser exactos)
- lexicográfico que se pueden ordenar
- canónicamente codificados como una cadena de 26 caracteres, en comparación con el UUID de 36 caracteres
- Usos base32 Crockford para una mayor eficacia y facilidad de lectura (5 bits por carácter)
- Caso insensible
- no hay caracteres especiales (URL segura)
- 1. ¿Cómo asegurar que una marca de tiempo sea siempre única?
- 2. comparar dos Marca de tiempo en Java
- 3. Configuración de la marca de tiempo de creación de archivo en Java
- 4. mysql almacena automáticamente la creación de registros marca de tiempo
- 5. Cómo convertir una marca de tiempo de Unix en una marca de tiempo ISO8601 en PHP?
- 6. Convirtiendo la marca de tiempo local a la marca de tiempo UTC en Java
- 7. Restablecer la parte de tiempo de una marca de tiempo en Java
- 8. RFC 3339 Marca de tiempo de salida en Java
- 9. Java: convertir un tiempo a partir de hoy en una marca de tiempo
- 10. Marca de tiempo actual como nombre de archivo en Java
- 11. Mostrar la marca de tiempo de compilación en una aplicación
- 12. Identificación única de marca de tiempo de alto rendimiento para varios subprocesos en Haskell
- 13. jQuery Hace tiempo de una marca de tiempo?
- 14. Agregando días a una marca de tiempo
- 15. Eliminar parte del tiempo de una marca de tiempo
- 16. Creación de DateTime a partir de la marca de tiempo en PHP <5.3
- 17. Campos de marca de tiempo en django
- 18. Lote: Marca de tiempo a UNIX Tiempo
- 19. Java sencilla Marca de tiempo a la conversión Fecha
- 20. Cómo convertir la marca de tiempo java a php timestamp?
- 21. ¿Cómo eliminar milisegundos de una marca de tiempo?
- 22. MySQL marca de tiempo sólo en crear
- 23. Convertir marca de tiempo en zonas horarias
- 24. Marca de tiempo personalizada en emacs orgmode
- 25. Marca de tiempo Unix en sqlite?
- 26. Marca de tiempo UNIX siempre en GMT?
- 27. Marca de tiempo del archivo en C++
- 28. ¿Cómo formatear una marca de tiempo Unix en Delphi?
- 29. Cómo actualizo automáticamente una marca de tiempo en PostgreSQL
- 30. ¿Cómo creo una marca de tiempo Unix en Android?
no estoy seguro de qué quiere decir * * estrangulación currentTimeMillis() para que devuelva * * como máximo un resultado ev ery ms? Si desea marcas de tiempo únicas, prefiere garantizar que devuelve un valor diferente en cada llamada, ¿verdad? –
¿Tienen que aumentar monótonamente? ¿Tienen que tener alguna relación con * time * real? ¿Tienen que ser únicos en múltiples ejecuciones? –