Ottenere un Identificativo Univoco Universale - UUID
Da Gambas-it.org - Wikipedia.
Per ottenere un Identificativo Univoco Universale - UUID [Nota 1] si possono invocare i seguenti file di sistema: [Nota 2]
* /etc/machine-id = ritorna un UUID statico (è sempre lo stesso) durante la sessione.
* /proc/sys/kernel/random/uuid = ritorna un UUID dinamico (varía ogni volta che si invoca il file di sistema che lo contiene).
Vediamo un esempio pratico:
Public Sub Main() Print RTrim(File.Load("/proc/sys/kernel/random/uuid")) End
Un altro esempio usando le sole risorse di Gambas:
Public Sub Main() Print Hex(Rand32(), 8); "-"; Hex(Rand32() And &ffff&, 4); "-"; Hex((Rand32() And &0fff) Or &4000, 4); "-"; Hex((Rand32() And &3fff) + &8000, 4); "-"; Hex(Rand32() And &ffff&, 4); Hex(Rand32(), 8) End Private Function Rand32() As Integer Dim dd As Integer = DateDiff("01/01/1970", Now, gb.Second) Return (Lsl(Rand(dd) And &03, 30)) Or (Lsl(Rand(dd) And &7fff, 15)) Or (Rand(dd) And &7fff) End
Usare alcune funzioni della libreria libc.so.6
Library "libc:6" ' void srand (unsigned int __seed) ' Seed the random number generator with the given number. Private Extern srand(__seed As Integer) ' int rand (void) ' Return a random integer between 0 and RAND_MAX inclusive. Private Extern rand_C() As Integer Exec "rand" Public Sub Main() ' "01/01/1970" è la data di inizio del "Unix Time Stamp" - Epoch: srand(DateDiff("01/01/1970", Now, gb.Second)) Print Hex(Rand32(), 8); "-"; Hex(Rand32() And &ffff&, 4); "-"; Hex((Rand32() And &0fff) Or &4000, 4); "-"; Hex((Rand32() And &3fff) + &8000, 4); "-"; Hex(Rand32() And &ffff&, 4); Hex(Rand32(), 8) End Private Function Rand32() As Integer Return (Lsl(rand_C() And &03, 30)) Or (Lsl(rand_C() And &7fff, 15)) Or (rand_C() And &7fff) End
Usare una libreria esterna appositamente creata
Si potrà usare anche una libreria esterna, appositamente creata, contenente alcune funzioni del API di "uuid".
Mostriamo un esempio pratico:
' 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
Note
[1] Vedere anche la seguente pagina: https://digitalbunker.dev/understanding-how-uuids-are-generated/
[2] Vedere anche la seguente pagina: Identificare univocamente un computer