Aktuelle Zeit: 25.04.2017 08:40

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: CreateUUID(Type.i=#UUID_V4, String.s="") Derzeit nur Random
BeitragVerfasst: 15.02.2017 18:30 
Offline
Benutzeravatar

Registriert: 05.02.2005 02:09
Wohnort: Stilli, Schweiz
Wer eine Library unabhängige Zufällige UUID Generieren möchte. Hier ist ein Codeschnipsel aus der derzeitigen SDK

Sorry hate noch einen Fehler drin... (Binär & Hex Konvertierung (8 bit))

Code:
; WCS_UUID by René Linder
;
; To the extent possible under law, the person who associated CC0 With
; WCS_UUID has waived all copyright And related Or neighboring rights
; To WCS_UUID.
;
; You should have received a copy of the CC0 legalcode along With this
; work. If Not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
   
Enumeration WCS_UUID_Version
  #UUID_V1
  #UUID_V2
  #UUID_V3
  #UUID_V4 ; Standard.
  #UUID_V5
EndEnumeration

Procedure.s CreateUUID(Type.i=#UUID_V4, String.s="")
  ;[T] CreateUUID(Type.i, String.s="")
  ;[D] Gibt eine UUID des Entsprechenden Types  als String zurück.
  ;[D] Derzeit nur Version 4 Implementiert. 
  ;[V] 0.0.1
  ;[M] 0.0.1   
  Protected P_Type.i = Type.i
  Protected P_String.s = String.s
  Protected P_UUID.s = ""
  Protected Dim P_Numbers.a(16)
  ;Protected P_Temp.a
  Protected P_Count.a
  Structure Struc_UUID
   
    low.a 
  EndStructure
 
  Select P_Type
    Case #UUID_V1
     
    Case #UUID_V2
     
    Case #UUID_V3
     
    Case #UUID_V5
     
    Default     ;#UUID_V4 RFC 4122 Konform
                ;xx xx xx xx - xx xx - 4x xx - yx xx - xx xx xx xx xx xx
      *Key = AllocateMemory(16)
      If OpenCryptRandom() And *Key
        CryptRandomData(*Key, 16)
       
        For P_Count = 0 To 15
          P_Numbers(P_Count) = PeekB(*Key+P_Count)
        Next P_Count     
       
        CloseCryptRandom()
      Else
        ;Not Save
        For P_Count = 0 To 15
          P_Numbers(P_Count) = Random(255)
        Next P_Count
      EndIf
     
      If *Key
        FreeMemory(*Key)
      EndIf
     
      P_Numbers(6) = Val("$4"+Right(RSet(Hex(P_Numbers(6), #PB_Byte), 2, "0"), 1))
      P_Numbers(8) = Val("%10"+Right(RSet(Bin(P_Numbers(8), #PB_Byte), 8, "0"), 6))
      P_UUID = ""
      For P_Count = 0 To 15
        If P_Count = 4 Or P_Count = 6 Or P_Count = 8 Or P_Count = 10
          P_UUID + "-"
        EndIf
        P_UUID + RSet(Hex(P_Numbers(P_Count), #PB_Byte), 2, "0")
      Next P_Count
     
  EndSelect
 
  ProcedureReturn P_UUID.s
EndProcedure


;Beispiel Code für zufällige UUID V4
For Y = 1 To 1000
  Debug CreateUUID()
Next Y


_________________
lmon Monitoring Service inkl. Clients
lweb-server Multi-Threaded Webserver
lbup-server Backup Server applikation
lmanager ERP Applikation.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CreateUUID(Type.i=#UUID_V4, String.s="") Derzeit nur Ran
BeitragVerfasst: 15.02.2017 20:34 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
Hier gibt es noch ein Beispiel zur V4: viewtopic.php?p=280506#p280506
wobei mir die Version ohne Lib besser gefällt :allright:

_________________
PureBasic 5.60 | SpiderBasic 2.0 | Windows 10 Pro (x64) | Linux Mint 18.1 (x64)
"Ich möchte gerne die Welt verändern, doch Gott gibt den Quellcode nicht frei."
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CreateUUID(Type.i=#UUID_V4, String.s="") Derzeit nur Ran
BeitragVerfasst: 16.02.2017 08:15 
Offline
Benutzeravatar

Registriert: 05.02.2005 02:09
Wohnort: Stilli, Schweiz
Meine Intention war eine Unabhängige Version für Win/Lin/Mac zu haben :D

Besteht die Interesse an der V3 & V5 (V1 & V2 werden wahrscheinlich gar nie Implementiert wegen Sicherheitsbedenken MAC Adresse der Netzwerkkarte ist in die UUID eingearbeitet.... nur wenn jemand explizit den Wunsch dazu äussert ;-) )

_________________
lmon Monitoring Service inkl. Clients
lweb-server Multi-Threaded Webserver
lbup-server Backup Server applikation
lmanager ERP Applikation.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CreateUUID(Type.i=#UUID_V4, String.s="") Derzeit nur Ran
BeitragVerfasst: 01.03.2017 10:51 
Offline
Benutzeravatar

Registriert: 05.02.2005 02:09
Wohnort: Stilli, Schweiz
Nun eine Threadsafe Variante die den CryptoRandom nur einmal öffnet:

Code:
;**************************************
;*
;* UUID.pbi
;*
;* (c) by Linder Hard- und Software
;*
;This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.
;To view a copy of this license,
;visit http://creativecommons.org/licenses/by-sa/4.0/
;OR send a letter To Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

Enumeration WCS_UUID_Version
  #UUID_V1
  #UUID_V2
  #UUID_V3
  #UUID_V4 ; Standard.
  #UUID_V5
EndEnumeration

Global WCS_UUID_CryptRandom.i

If OpenCryptRandom()
  WCS_UUID_CryptRandom = 1
Else
  WCS_UUID_CryptRandom = 0
EndIf

Procedure.s CreateUUID(Type.i=#UUID_V4, String.s="")
  ;[T] CreateUUID(Type.i, String.s="")
  ;[D] Gibt eine UUID des Entsprechenden Types  als String zurück.
  ;[D] Derzeit nur Version 4 Implementiert.
  ;[V] 0.0.2
  ;[M] 0.0.2 Threadsafe OpenCryptRandom only Once
  ;[M] 0.0.1   
  Protected P_Type.i = Type.i
  Protected P_String.s = String.s
  Protected P_UUID.s = ""
  Protected Dim P_Numbers.a(16)
  ;Protected P_Temp.a
  Protected P_Count.a
  Protected Key
 
  Structure Struc_UUID
   
    low.a
  EndStructure
 
  Select P_Type
;     Case #UUID_V1
;     
;     Case #UUID_V2
;     
;     Case #UUID_V3
;     
;     Case #UUID_V5
    Case 10
     
    Default     ;#UUID_V4 RFC 4122 Konform
                ;xx xx xx xx - xx xx - 4x xx - yx xx - xx xx xx xx xx xx
      Key = AllocateMemory(16)

      If WCS_UUID_CryptRandom And Key
        CryptRandomData(Key, 16)
       
        For P_Count = 0 To 15
          P_Numbers(P_Count) = PeekB(Key+P_Count)
        Next P_Count     
       
      Else
        ;Not Save
        For P_Count = 0 To 15
          P_Numbers(P_Count) = Random(255)
        Next P_Count
      EndIf
     
      If Key
        FreeMemory(Key)
      EndIf
     
      P_Numbers(6) = Val("$4"+Right(RSet(Hex(P_Numbers(6), #PB_Byte), 2, "0"), 1))
      P_Numbers(8) = Val("%10"+Right(RSet(Bin(P_Numbers(8), #PB_Byte), 8, "0"), 6))

      P_UUID = ""
     
      For P_Count = 0 To 15
        If P_Count = 4 Or P_Count = 6 Or P_Count = 8 Or P_Count = 10
          P_UUID + "-"
        EndIf
        P_UUID + RSet(Hex(P_Numbers(P_Count), #PB_Byte), 2, "0")
      Next P_Count
     
  EndSelect

  ProcedureReturn P_UUID
EndProcedure

Procedure IsUUID(UUID.s , Type.i = #UUID_V4)
  ;[T] IsUUID(UUID.s , Type.i = #UUID_V4)
  ;[D] Prüft ob die UUID entsprechend Version 4 und RFC 4122 Konform ist.
  ;[V] 0.0.1
  ;[M] 0.0.1     
  If Mid(UUID.s, 15,1) = Str(Type+1)
    If Left(Bin(Val("$"+Mid(UUID.s, 15,2)), #PB_Byte),2) = "10"
      ProcedureReturn #True
    EndIf
  EndIf
 
  ProcedureReturn #False
EndProcedure

_________________
lmon Monitoring Service inkl. Clients
lweb-server Multi-Threaded Webserver
lbup-server Backup Server applikation
lmanager ERP Applikation.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CreateUUID(Type.i=#UUID_V4, String.s="") Derzeit nur Ran
BeitragVerfasst: 01.03.2017 20:56 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Würde ich nicht nehmen. Viele UUID sind bereits von System oder Fondations festvergeben.
Das schlimmste was passieren kann ist das ein bereits fest vergebene UUID erzeugst und dann mit der die Registry zerschießt.

_________________
Alles ist möglich, fragt sich nur wie...
Projekte EventDesigner v1.x / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CreateUUID(Type.i=#UUID_V4, String.s="") Derzeit nur Ran
BeitragVerfasst: 01.03.2017 21:17 
Offline
Benutzeravatar

Registriert: 19.01.2015 10:18
? UUID ist doch einzigartiger als GUID oder liege ich falsch ? Wird da nicht zu sätzlich mit Zeitstempel generiert ? Wie kann es den die Registry zerschiessen ?

_________________
Ich benutze Pure Basic 5.30 auf Microsoft Windows 7.
Gruß
JM


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CreateUUID(Type.i=#UUID_V4, String.s="") Derzeit nur Ran
BeitragVerfasst: 01.03.2017 21:46 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
Es ist doch gerade der Sinn der Sache, das möglichst keine gleichen UUIDs erzeugt werden. Mit der Routine können wohl,
mehrere hunderte Jahre lang UUIDs erzeugt werden, ohne das eine bereits vergeben ist oder bereits in der Registry existiert :mrgreen:
GUID und UUID sind dasselbe, nur das GUID eine Bezeichnung von Microsoft ist.

https://de.wikipedia.org/wiki/Universal ... Identifier

_________________
PureBasic 5.60 | SpiderBasic 2.0 | Windows 10 Pro (x64) | Linux Mint 18.1 (x64)
"Ich möchte gerne die Welt verändern, doch Gott gibt den Quellcode nicht frei."
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CreateUUID(Type.i=#UUID_V4, String.s="") Derzeit nur Ran
BeitragVerfasst: 01.03.2017 22:21 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
Code:
InitNetwork()

*Buffer = ReceiveHTTPMemory("https://www.uuidgenerator.net/api/version4")
If *Buffer
  Size = MemorySize(*Buffer)
  Debug "UUID: " + PeekS(*Buffer, Size, #PB_UTF8|#PB_ByteLength)
  FreeMemory(*Buffer)
Else
  Debug "Failed"
EndIf


-> How to use the UUIDGenerator.net API

:mrgreen:

_________________
<Alt>+<F4> und der Tag gehört Dir


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CreateUUID(Type.i=#UUID_V4, String.s="") Derzeit nur Ran
BeitragVerfasst: 15.03.2017 19:16 
Offline
Benutzeravatar

Registriert: 05.02.2005 02:09
Wohnort: Stilli, Schweiz
Wow solte mich mal öfters einlogen hier ....

mk-soft hat geschrieben:
Würde ich nicht nehmen. Viele UUID sind bereits von System oder Fondations festvergeben.
Das schlimmste was passieren kann ist das ein bereits fest vergebene UUID erzeugst und dann mit der die Registry zerschießt.


Also da eine Gem RFC 4122 Version 4 UUID erzeugt wird ist die Wahrscheinlichkeit < 0,(unendlich 0)1 oder ähnlich das eine doppelte UUID erzeugt wird. Gem. Spezifikation kann das eigentlich nicht passieren und vor allem fest vergebene wie 1.2.3 und 5er.

Code:
;xx xx xx xx - xx xx - 4x xx - yx xx - xx xx xx xx xx xx


Die 4 an der Stelle sagt / bedeutet das das ein Vollständiger Random UUID ist und da ist definitiv nichts Fest vergeben ;-) Diese Routine arbeitet seit nunmehr 2 Wochen in einer Shared Web/Java/Linux/Windows Umgebung mit Täglich mehr als 100'000 Anfragen Fehlerfrei.

PS: Sorry sollte alles Korrektur lesen vor dem Absenden :freak:

_________________
lmon Monitoring Service inkl. Clients
lweb-server Multi-Threaded Webserver
lbup-server Backup Server applikation
lmanager ERP Applikation.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: CreateUUID(Type.i=#UUID_V4, String.s="") Derzeit nur Ran
BeitragVerfasst: 15.03.2017 19:23 
Offline
Benutzeravatar

Registriert: 05.02.2005 02:09
Wohnort: Stilli, Schweiz
Und nun noch eine Variante aus der Cloud SDK Suite die SpiderBasic & PureBasic Tauglich ist benötigt aber noch das GEN.pbi für den Debug Bereich...

SYS/GEN/GEN.pbi:
Code:
;**************************************
;*
;* GEN.pbi
;*
;* Generische Funktionen Makros
;*
;* (c) by Linder Hard- und Software
;*
;This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.
;To view a copy of this license,
;visit http://creativecommons.org/licenses/by-sa/4.0/
;OR send a letter To Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

CompilerIf Not Defined(WCS_DEBUG, #PB_Constant)
  CompilerError "#WCS_DEBUG Muss Definiert sein"
CompilerEndIf

#Debug_Element = "all"

Macro DebugElement(DebugElements, Lvl)
  If #Debug_Element = "all"
    CompilerIf #PB_Compiler_OS = #PB_OS_Web
      Debug Lvl + DebugElements 
    CompilerElse
      PrintN(Lvl + DebugElements)
    CompilerEndIf
  ElseIf #Debug_Element = Left(DebugElements, Len(#Debug_Element))
    CompilerIf #PB_Compiler_OS = #PB_OS_Web
      Debug Lvl + DebugElements 
    CompilerElse
      PrintN(Lvl + DebugElements)
    CompilerEndIf
  EndIf
EndMacro

Macro DebugLvl0(DebugMSG)
  CompilerIf #WCS_DEBUG >= 0
    ;Debug DebugMSG
    DebugElement(DebugMSG , "lvl0:")
  CompilerEndIf   
EndMacro

Macro DebugLvl1(DebugMSG)
  CompilerIf #WCS_DEBUG >= 1
    ;Debug DebugMSG
    DebugElement(DebugMSG , "lvl1:")
  CompilerEndIf
EndMacro

Macro DebugLvl2(DebugMSG)
  CompilerIf #WCS_DEBUG >= 2
    ;Debug DebugMSG
    DebugElement(DebugMSG , "lvl2:")
  CompilerEndIf
EndMacro

Macro DebugLvl3(DebugMSG)
  CompilerIf #WCS_DEBUG >= 3
    ;Debug DebugMSG
    DebugElement(DebugMSG , "lvl3:")
  CompilerEndIf
EndMacro


SYS/GEN/UUID.pbi
Code:
;**************************************
;*
;* UUID.pbi
;*
;* (c) by Linder Hard- und Software
;*
;This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.
;To view a copy of this license,
;visit http://creativecommons.org/licenses/by-sa/4.0/
;OR send a letter To Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

Enumeration WCS_UUID_Version
  #UUID_V1
  #UUID_V2
  #UUID_V3
  #UUID_V4 ; Standard.
  #UUID_V5
EndEnumeration

Global WCS_UUID_CryptRandom.i

CompilerIf #PB_Compiler_OS = #PB_OS_Web
  WCS_UUID_CryptRandom = 0
CompilerElse
  If OpenCryptRandom()
    WCS_UUID_CryptRandom = 1
  Else
    WCS_UUID_CryptRandom = 0
  EndIf
CompilerEndIf

Procedure.s CreateUUID(Type.i=#UUID_V4, String.s="")
  ;[T] CreateUUID(Type.i, String.s="")
  ;[D] Gibt eine UUID des Entsprechenden Types  als String zurück.
  ;[D] Derzeit nur Version 4 Implementiert.
  ;[V] 0.0.1
  ;[M] 0.0.1   
  Protected P_Type.i = Type.i
  Protected P_String.s = String.s
  Protected P_UUID.s = ""
  Protected Dim P_Numbers.a(16)
  ;Protected P_Temp.a
  Protected P_Count.a
  Protected Key
 
  Structure Struc_UUID
   
    low.a
  EndStructure
 
  Select P_Type
;     Case #UUID_V1
;     
;     Case #UUID_V2
;     
;     Case #UUID_V3
;     
;     Case #UUID_V5
    Case 10
     
    Default     ;#UUID_V4 RFC 4122 Konform
                ;xx xx xx xx - xx xx - 4x xx - yx xx - xx xx xx xx xx xx
      DebugLvl3("CreateUUID: Start Allocate")
     
      Key = AllocateMemory(16)
      ;Key = 0
      DebugLvl3("CreateUUID: Alocated Address:"+Str(Key))
      CompilerIf #PB_Compiler_OS <> #PB_OS_Web
      If WCS_UUID_CryptRandom And Key
      DebugLvl3("CreateUUID: Randomcrypt.")
       
        CryptRandomData(Key, 16)
       
        For P_Count = 0 To 15
         
            P_Numbers(P_Count) = PeekB(Key+P_Count)
         
        Next P_Count     
       
      Else
      CompilerElse
      If WCS_UUID_CryptRandom = 0
      CompilerEndIf
        DebugLvl3("CreateUUID: Unsave Random")
        For P_Count = 0 To 15
          P_Numbers(P_Count) = Random(255)
        Next P_Count
      EndIf
      DebugLvl3("CreateUUID: Memoryfreigabe")
     
      If Key
        FreeMemory(Key)
      EndIf
      DebugLvl3("CreateUUID: P_Numbers")
     
      P_Numbers(6) = Val("$4"+Right(RSet(Hex(P_Numbers(6), #PB_Byte), 2, "0"), 1))
      P_Numbers(8) = Val("%10"+Right(RSet(Bin(P_Numbers(8), #PB_Byte), 8, "0"), 6))
      DebugLvl3("CreateUUID: Umwandeln zu String")
      P_UUID = ""
      For P_Count = 0 To 15
        If P_Count = 4 Or P_Count = 6 Or P_Count = 8 Or P_Count = 10
          P_UUID + "-"
        EndIf
        P_UUID + RSet(Hex(P_Numbers(P_Count), #PB_Byte), 2, "0")
      Next P_Count
     
  EndSelect
  DebugLvl3("CreateUUID: Rückgabe:"+P_UUID)
  ProcedureReturn P_UUID
EndProcedure

Procedure IsUUID(UUID.s , Type.i = #UUID_V4)
  ;[T] IsUUID(UUID.s , Type.i = #UUID_V4)
  ;[D] Prüft ob die UUID entsprechend Version 4 und RFC 4122 Konform ist.
  ;[V] 0.0.1
  ;[M] 0.0.1     
  If Mid(UUID.s, 15,1) = Str(Type+1)
    If Left(Bin(Val("$"+Mid(UUID.s, 15,2)), #PB_Byte),2) = "10"
      ProcedureReturn #True
    EndIf
  EndIf
 
  ProcedureReturn #False
EndProcedure

_________________
lmon Monitoring Service inkl. Clients
lweb-server Multi-Threaded Webserver
lbup-server Backup Server applikation
lmanager ERP Applikation.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye