UUID - Identificador Universal Único

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

UUID - Identificador Universal Único

Mensagem por Itamar M. Lins Jr. »

Ola!
O que é?

UUID é um identificador universalmente exclusivo utilizado para identificação de qualquer coisa no mundo da computação. O UUID é um número de 128 bits representado por 32 dígitos hexadecimais, exibidos em cinco grupos separados por hifens, na forma textual8-4-4-4-12 sendo um total de 36 caracteres (32 caracteres alfanuméricos e 4 hifens). Por exemplo:
3d0ca315-aff9–4fc2-be61–3b76b9a2d798

Código: Selecionar todos

function main
? random_uuid()
return nil

function random_uuid()

   local cMask := 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
   local cStringHex := '0123456789abcdef-', x
   local cUUID := '', i, cCaracter

   for x := 1 to Len( cMask )
      i := Int( hb_Random( 0, 0xffff ) % 16 )

      cCaracter := SubStr( cMask, x, 1 )

      if cCaracter == 'x'
         cUUID += SubStr( cStringHex, i, 1 )
      elseif cCaracter == 'y'
         cUUID += SubStr( cStringHex, HB_BitOr( HB_BitAnd( i, 0x03 ), 0x08 ), 1 )
      else //- e 4
         cUUID += cCaracter
      endif

   next

return cUUID
Ou usando as funções da HBWIN para quem tá no windows.

Código: Selecionar todos

function main
? win_UuidCreateString()
return nil
>hbmk2 uuid.prg hbwin.hbc
https://medium.com/trainingcenter/o-que ... 7a66644a2b

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

UUID - Identificador Universal Único

Mensagem por JoséQuintas »

Apesar de aparentemente novidade....

No final das contas, é um número, que ao invés de decimal é hexadecimal.
Já pensei em algo assim, pra poder vincular tudo que existe no aplicativo.
É como um RecNo(), mas GERAL, e não de um único arquivo.
De posse do número, encontra-se a informação.

Lógico, pra uso mundial, definiram alguns padrões, e com certeza acaba limitando, e acaba deixando de ser tão universal assim.

Isso lembra também o IPV6, que substitui o tradicional IP 255.255.255.255
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

UUID - Identificador Universal Único

Mensagem por susviela@bol.com.br »

Itamar M. Lins Jr. escreveu:O que é?

UUID é um identificador universalmente exclusivo utilizado para identificação de qualquer coisa no mundo da computação. O UUID é um número de 128 bits representado por 32 dígitos hexadecimais, exibidos em cinco grupos separados por hifens, na forma textual8-4-4-4-12 sendo um total de 36 caracteres (32 caracteres alfanuméricos e 4 hifens). Por exemplo:

3d0ca315-aff9–4fc2-be61–3b76b9a2d798

Alguns Sistemas Bancários já usam esse identificador único em suas transações.

É uma boa opção, para ID, só o tamanho um pouco grande, mas o custo benefício, para um sistema de grande porte parece razoável.

Obrigado por compartilhar, já tinha lido sobre isso.
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

UUID - Identificador Universal Único

Mensagem por bencz »

Itamar, boas tardes!

Infelizmente, o seu código está gerando apenas uma mistura de números aleatórios e não está gerando um UUID valido ( teste o UUID gerado neste site: https://www.uuidtools.com/decode... um UUID, ou também conhecido como GUID, possui algumas regras para ser gerado... no caso, você está gerando uma tentativa de GUID da versão 4, mas, está faltando um outro byte de identificação do GUID

Gerar um Guid valido não é a coisa mais simples da terra... por isso, é mais seguro utilizar as funções do sistema operacional, segue um exemplo:

Código: Selecionar todos

function start()
    ? GenerateGuid()
    ? GenerateGuid(.T.)
    ? GenerateGuid(.F.)    
return nil

#pragma BEGINDUMP

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include "hbapi.h"

HB_FUNC ( GENERATEGUID )
{
    GUID guid;
    char guidString[37];
    char guidStringFormat[68];
    
    if((int)hb_parl(1) == 1)
        strcpy(guidStringFormat, "%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX");
    else
        strcpy(guidStringFormat, "%08lx-%04hx-%04hx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx");
    
    CoCreateGuid(&guid);
    
    sprintf(guidString, guidStringFormat,
      guid.Data1, guid.Data2, guid.Data3,
      guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
      guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
      
    hb_retc(guidString);    
}

#pragma ENDDUMP
Imagem
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

UUID - Identificador Universal Único

Mensagem por Itamar M. Lins Jr. »

Ola!
https://en.wikipedia.org/wiki/Universal ... 4_(random)
A versão 4 não é assim ? Mas realmente não é a minha praia.
O código é do Willian Manesco.
https://groups.google.com/forum/#!searc ... -iMKliBwAJ
Mais abaixo, dizem para usar:

Código: Selecionar todos

   i := Int( hb_Random( 0, 0xffff ) % 17 )  
Eu vou pelo raciocínio do José Quintas, é um numero grandão, com 5 campos aleatórios. Como se fosse 5 CPF's randomizado, muito difícil repetir.
Esse é mais um que achei nos exemplos do mod_harbour

Código: Selecionar todos

function Main()

   BLOCKS
      <script>
         var value = sessionStorage.getItem( "MyId" );
       
         if( value == null )
         {
            value = "{{generateUUID()}}"; 
            sessionStorage.setItem( "MyId", value );
         }

         document.write( value );
      </script>
   ENDTEXT

   ? "UUID generated on the server"

return nil

function GenerateUUID()

   local cChars := "0123456789ABCDEF"
   local cUUID  := ""

   for n = 1 to 8
      cUUID += SubStr( cChars, hb_Random( 1, 16 ), 1 )
   next
   
   cUUID += "-4"

   for n = 1 to 3
      cUUID += SubStr( cChars, hb_Random( 1, 16 ), 1 )
   next

   cUUID += "-"

   for n = 1 to 4
      cUUID += SubStr( cChars, hb_Random( 1, 16 ), 1 )
   next

   cUUID += "-"

   for n = 1 to 12
      cUUID += SubStr( cChars, hb_Random( 1, 16 ), 1 )
   next
 
return cUUID
O objetivo é exatamente esse, mostrarmos a maneira de gerar um identificador que será muito difícil repetir.
Mas, ainda tem como vc mostrou, a forma correta de testar o calculo. Pois vi que tem versões 1,2,3,4 e 5 de calculo de UUID.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

UUID - Identificador Universal Único

Mensagem por Itamar M. Lins Jr. »

Ola!
Ue! testei 16% e 17%
Retornou como certo.
Disse que é uma variante dessa versão: DCE 1.1, ISO/IEC 11578:1996

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

UUID - Identificador Universal Único

Mensagem por Itamar M. Lins Jr. »

Ola!
Já esse ai do mod_harbour, não atendeu ao formato solicitado.
function GenerateUUID()
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

UUID - Identificador Universal Único

Mensagem por alxsts »

Olá!

Para quem usa banco de dados relacionais, basta executar o select apropriado para o banco em uso e obter o UUID ou GUID. Os principais gerenciadores de BD suportam esta funcionalidade.
Exemplo para MS SQL Server:

Código: Selecionar todos

SELECT NewId ()
[]´s
Alexandre Santos (AlxSts)
Responder