(11-05-2023, 10:26)Shordi escribió: Es un valor que no se va a volver a repetir nunca.
Digamos que la idea de un identificador único es que nunca se repita en ninguna parte.
Si para el muestreo tomas una única maquina y la unidad mínima de tiempo es el micro segundo podría darse que dentro de este ámbito el ID [1] nunca se repetirá, pero si tomas un conjunto mayor, por ejemplo todas maquinas que envían un informe al un servidor central ahí si que existe riesgo de que el mismo ID sea enviado por dos o más maquinas diferentes.
[1] No se cuanto tarda el bucle de gambas pero supongo que sera mayor a 1 micro segundo.
Propongo este código como ejercicio para ver el efecto, en este se podrá apreciar que el método "Format" no funciona incluso en la misma maquina, tal ves si se pudiera usar el micro segundo...
Y ya que estamos ¿Como demomios puedo contar los milisegundos o microsegundos que tarda cada algoritmo ? En mi maquina t2 siempre da 0 ¿Que hago mal?
Código:
' Gambas class file
Public t2 As Integer
Public hTimer As Timer
Public Sub Form_Open()
hTimer = New Timer As "MyTimer"
hTimer.Restart
End
Public Sub MyTimer_Timer()
t2 = t2 + 2
End
Public Sub Button1_Click()
Dim i, j, t As Integer
Dim a As New String[]
Dim sKey As String
Dim o As Collection = ["Process": 1, "Format": 2, "Randomize": 3]
j = 20000
For Each t In o
a.Clear
t2 = 0
hTimer.Restart
For i = 1 To j
Select t
Case 1
sKey = UUID()
Case 2
sKey = UIDBro()
Case 3
sKey = Rand32()
End Select
If Not a.Exist(sKey) Then
a.Add(sKey)
Endif
Next
'hTimer.Stop
If a.Count < j Then
Message.Warning(Subst(("The algorithm &1 is risky as out of a rate of &2 attempts only &3 were unique."), o.Key, CStr(j), CStr(a.Count)))
Else
Message.Info(Subst(("Algorithm &1 works, for &2 attempts it took &3 milliseconds."), o.Key, CStr(j), CStr(t2)))
Endif
Next
End
Private Function UUID() As String
Return RTrim(File.Load("/proc/sys/kernel/random/uuid"))
End
Private Function UIDBro() As String
Return Format(Now(), "ddmmyyyhhnnssuu")
End
Private Function Rand32() As String
Dim dd As Integer = DateDiff("01/01/1970", Now, gb.Second)
Dim ra As Integer
Dim s As String
ra = (Lsl(Rand(dd) And &03, 30)) Or (Lsl(Rand(dd) And &7fff, 15)) Or (Rand(dd) And &7fff)
s = Hex(ra, 8) & "-" & Hex(ra And &ffff&, 4) & "-" & Hex((ra And &0fff) Or &4000, 4) & "-" & Hex((ra And &3fff) + &8000, 4) & "-" & Hex(ra And &ffff&, 4) & Hex(ra, 8)
Return s
End