Cita:timestamp - maquina - usuario - sub proceso - incrementalEso es lo mismo, más o menos, que sugería yo más arriba, pero lo veo excesivamente complejo.
entonces cada PC/servidor podria generar un numero que seria unico en todo el sistema que aloja o usa el software porque cada maquina es unica, y la velocidad no importa porque el INCREMENTAL se va agrandando a medida que se generan items en la lista, en un ejemplo practico:
La MAQUINA 1 genera a las 12:00 del 01/01/2024 una operacion X, siendo la primera del dia:
0101241200-0001-0000-000000000001
La MAQUINA 2 genera a las 12:00 del 01/01/2024 una operacion X, siendo la primera del dia:
0101241200-0002-0000-000000000001
y ambos son unicos en el todo sistema
(11-05-2023, 18:20)Shordi escribió: Lo del incremental no lo tengo claro porque
Public lIndex as Long = 0
Public Function NewID() as String
Inc lIndex
Return Hex(lIndex)
End Function
Library "libuuid:1.3.0"
Private Const UUID_STR_LEN As Integer = 37
' void uuid_generate(uuid_t out)
Private Extern uuid_generate(out As Integer)
' void uuid_unparse_lower(const uuid_t uu, char *out)
Private Extern uuid_unparse_lower(uu As Integer, out As Byte[]) As Integer
Public Sub Main()
Dim uuid As New Byte[UUID_STR_LEN]
Dim i As Integer
uuid_generate(i)
uuid_unparse_lower(i, uuid)
Print uuid.ToString(0, 36)
End
' char * creauuid()
Private Extern creauuid() As Pointer In "/tmp/libcreauuid"
Public Sub Main()
Dim p As Pointer
Creaso()
p = creauuid()
Print String@(p)
End
Private Procedure Creaso()
File.Save("/tmp/libcreauuid.c", "#include <stdlib.h>\n#include <stdio.h>\n#include <uuid/uuid.h>\n\n" &
"char out[UUID_STR_LEN]={0};\n\n"
"char * creauuid() {\n\n" &
"uuid_t i;\n\n" &
" uuid_generate(i);\n\n" &
" uuid_unparse_lower(i, out);\n\n" &
" return out;\n\n}")
Shell "gcc -o /tmp/libcreauuid.so /tmp/libcreauuid.c -luuid -shared -fPIC" Wait
End
(12-05-2023, 14:16)vuott escribió: He encontrado un ejemplo en lenguaje C que funciona, pero cuando lo traduzco a Gambas:
(12-05-2023, 14:16)vuott escribió: me da un error en la primera función externa de la librería 'libuuid'.
(12-05-2023, 13:32)Shordi escribió: ¿Insuficiente para qué? Creo que no he entendido el problema aún...
Cita:Una muestra de 3,26*10¹⁶ UUID tiene un 99,99% de posibilidades de no tener duplicados. Generar tantos UUID, a razón de uno por segundo, llevaría mil millones de años. Así que, aunque los UUID no son realmente únicos, sí lo son lo suficiente a efectos prácticos, teniendo en cuenta las limitaciones naturales de la vida humana y la separación de los sistemas.
(12-05-2023, 13:58)tercoide escribió: Claro, Tincho necesita un UUID de algun tipo para asociarlo a algun dato, que puede ser cualquier cosa. Pero para poder responder a su inquietud es necesario saber para que lo necesita.
(11-05-2023, 18:01)tercoide escribió: La palabra "universal" implica otros planetas lejanos?
' Gambas class file
Export
Library "libuuid"
Private Const UUID_STR_LEN As Integer = 37
' void uuid_generate(uuid_t out)
Private Extern uuid_generate(out As Integer)
' void uuid_unparse_lower(const uuid_t uu, char *out)
Private Extern uuid_unparse_lower(uu As Integer, out As Byte[]) As Integer
Private Extern creauuid() As Pointer In "/tmp/libcreauuid"
Static Public Function Gen() As String
Dim p As Pointer
If Not Exist("/tmp/libcreauuid.so") Then
File.Save("/tmp/libcreauuid.c", "#include <stdlib.h>\n#include <stdio.h>\n#include <uuid/uuid.h>\n\n" &
"char out[UUID_STR_LEN]={0};\n\n"
"char * creauuid() {\n\n" &
"uuid_t i;\n\n" &
" uuid_generate(i);\n\n" &
" uuid_unparse_lower(i, out);\n\n" &
" return out;\n\n}")
Shell "gcc -o /tmp/libcreauuid.so /tmp/libcreauuid.c -luuid -shared -fPIC" Wait
Endif
p = creauuid()
Return String@(p)
End
Public Function UIDBro() As String
Static nkey As Integer
Static sLastKey As String
Dim sOffset As String
Static sCurrKeytKey As String
Dim sMark As String
' Utilizo la forma ISO 2023-05-12 22:48:01.235
sCurrKeytKey = Format(Now(), "yyyymmddhhnnssuu")
If sCurrKeytKey <> sLastKey Then
sLastKey = sCurrKeytKey
nkey = 0
' Pongo una marca para saber donde se resetea el contador, luego en produccion hay que comentar est alinea
sMark = "---"
Endif
sOffset = Right("00000" & Str(nkey), 5) & sMark
sMark = ""
Inc nkey
Return sCurrKeytKey & sOffset
End
Cita:Algorithm Kernel works, for 100000 attempts it took 0.743848797999817 milliseconds.
Algorithm Timestamp works, for 100000 attempts it took 0.14394091000031 milliseconds.
The algorithm Randomize is risky as out of a rate of 100000 attempts only 99999 were unique.
Algorithm C-Library works, for 100000 attempts it took 0.985727743000098 milliseconds.