Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Identificador único universal
#21

Tan solo unas pequeñas precisiones sobre mi algoritmo:

GAMBAS
  1. Private Sub getkey() As String
  2.  
  3.   Static nkey As Integer
  4.   Dim sOffset As String
  5.  
  6.   Inc nkey
  7.   If nkey > 99999 Then nkey = 0
  8.   sOffset = Right("00000" & Str(nkey), 5)
  9.   Return Format(Now(), "yyyymmddhhnnssuu") & sOffset



1- El format con los años primeros, perfecto, permite ordenar claves (Aunque esto me recuerda a lo que siempre me decía el alemán con quien colaboré sobre el cliente FTP: "¡Pero eso no estaba en las condiciones del proyecto!" y a lo que yo respondía "Sin improvisación no es divertido"...)

2- El lugar "natural" de GetKey es dentro de un módulo, de manera que sea accesible desde cualquier parte del proyecto donde se use. Por tanto la función debe devolver el valor para que sea recogido y aplicado en la clase desde donde se le llame.

2- Se declara STATIC nkey para que una vez se establezca el valor, la secuencia continue ininterrumpida a todo lo largo de la sesión del proyecto que use la función. Dicha secuencia es resetada cada 99999 claves generadas en la sesión y lo limité el offset a eso por no hacer la clave muy larga... pero visto la longitud de las claves de los otros algoritmos, pues se puede ampliar todo lo que se quiera.

      En el retoque de Tincho también se declaran STATIC LastKey (útima clave generada) y sCurrKeyTkey (Control de timestamp duplicados) y se resetea el offset cada cambio de éste último. Es otra forma de hacerlo totalmente válida, por supuesto, pero de cuya utilidad no estoy muy seguro.

Respecto a los Tests propuesto por Tincho, observo que a medida que crece el array de claves se enlentece el proceso, claro. Por tanto, una vez que estamos seguros que la función getkey funciona perfectamente y no es necesaria ninguna comprobación, si cambiamos el código a ésto:
GAMBAS
  1. Public Sub Button2_Click()
  2.  
  3.   Dim a As New String[]
  4.   Dim skey As String
  5.   Dim t1, t2 As Float
  6.  
  7.   TextArea1.text &= "\n\n Conteo por tiempo"
  8.   t1 = Timer
  9.     skey = getkey()
  10.     Inc i
  11.     t2 = Timer - t1
  12.     If t2 > vbSegundos.Value Then Break
  13.   Wend
  14.   TextArea1.text &= "\nClaves únicas obtenidas por segundo " & Str(i / vbSegundos.Value)



La velocidad de generación pasa de más o menos 20.000 por segundo y disminuyendo... a 1.350.000 por segundo de manera constante. Si eliminamos la necesidad de que todas las claves sean iguales de largas, es decir:

GAMBAS
  1. Private Sub getkey() As String
  2.  
  3.   Static nkey As Integer
  4.  
  5.   Inc nkey
  6.   Return Format(Now(), "yyyymmddhhnnssuu") & nkey)
  7.  



Entonces la velocidad de generación de claves únicas asciende por encima de 1.500.000 por segundo, suficiente para TercoIde, supongo Big Grin Big Grin .

Adjunto un proyectito que muestra esto:
[Imagen: rgf9KZI.png]

Saludos


Archivos adjuntos
.gz sample-uuid-contest-0.0.3.tar.gz Tamaño: 13.37 KB  Descargas: 1

No podemos regresar
[-] Los siguientes 1 usuarios dice gracias a Shordi por este post:
  • tincho
    ¡Gracias!
#22

(13-05-2023, 11:48)Shordi escribió:  En el retoque de Tincho también se declaran STATIC LastKey (útima clave generada) y sCurrKeyTkey (Control de timestamp duplicados) y se resetea el offset cada cambio de éste último. Es otra forma de hacerlo totalmente válida, por supuesto, pero de cuya utilidad no estoy muy seguro.

Es para controlar la cantidad de nkey, ya que si la fecha cambia no tiene ningún sentido que nKey continúe aumentando, me parece mas prolijo y ordenado que cada vez que cambie la marca temporal este tenga un nKey = 0. Pero si la velocidad es la prioridad el método sin ninguna comprobación es el mejor.

1 Saludo.
    ¡Gracias!
#23

Vuott paso un código en la lista de correo que usa la librería estándar libc.
Tome ese código y lo adapte un poco para usarlo como función, el rendimiento es excelente solo el doble de tiempo que el ID de Shordi .

GAMBAS
  1. ' Gambas class file
  2.  
  3.  
  4. Library "libc:6"
  5.  
  6. ' void srand (unsigned int __seed)
  7. ' Seed the random number generator with the given number.
  8. 'Private Extern srand(__seed As Integer)
  9.  
  10. ' int rand (void)
  11. ' Return a random integer between 0 and RAND_MAX inclusive.
  12. Private Extern rand_C() As Integer Exec "rand"
  13.  
  14.  
  15.   ' "01/01/1970" is Unix Time Stamp - Epoch:
  16.   Dim iRan As New Integer[]
  17.  
  18.   'srand(DateDiff("01/01/1970", Now, gb.Second))
  19.  
  20.   iRan.Clear
  21.  
  22.   For i = 0 To 5
  23.     iRan.Add((Lsl(rand_C() And &03, 30)) Or (Lsl(rand_C() And &7fff, 15)) Or (rand_C() And &7fff))
  24.   Next
  25.  
  26.   Return Hex(iRan[0], 8) & "-" & Hex(iRan[1] And &ffff&, 4) & "-" & Hex((iRan[2] And &0fff) Or &4000, 4) & "-" & Hex((iRan[3] And &3fff) + &8000, 4) & "-" & Hex(iRan[4] And &ffff&, 4) & Hex(iRan[5], 8)
  27.  
  28.  
  29. ' Private Function Rand32() As Integer
  30. '
  31. '   Return (Lsl(rand_C() And &03, 30)) Or (Lsl(rand_C() And &7fff, 15)) Or (rand_C() And &7fff)
  32. '
  33. ' End



1 Saludo.
    ¡Gracias!


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)