UUID-GeneratorIch versuche, eine Standard-Guid zu erstellen, aber hex() gibt mir einen seltsamen Wert. Ich gehe davon aus, dass es an der von hex() verwendeten Kodierung liegt.
Kann mir jemand etwas Klarheit über das folgende Skript geben? Oder wenn jemand auch nur eine UUID-Funktion hätte, wäre das noch besser.
Names default to here(1);
full_h = "123e4567-e89b-12d3-a456-426655440000";
h = substitute(h, "-", "");
n = hex to number(h);
h_again = hex(n);
n_again = hex to number(h);
show(h == h_again, n == n_again);
Danke
Betreff: UUID-GeneratorHier ist eine Methode zum Erstellen einer UUID:
newuuid = function({},
//following procedure here: https://www.cryptosys.net/pki/uuid-rfc4122.html
strout = "";
//guid made from 16 hex bytes
for(i=1, i<=16, i++,
thisint = random integer(256) - 1;
thisbyte = right(hex(thisint,"integer"),2);
if( i == 7, //the four most significant bits of the of the 7th byte are 0100
thisbyte = char(4) || right(thisbyte,1),
i == 9, //the two most significant bits of the 9th byte are 01
//decimal to binary
bin = "";
value = thisint;
While(value,
bin = Char(Modulo(Num(value), 2)) || bin;
value = Floor(value / 2);
);
//fix digits
bin = right(bin,8,"0");
bin = "10" || right(bin, 6);
//back to decimal
dec = 0;
While(length(bin) > 0,
dec = dec + (num(left(bin, 1))*2)^(num(length(bin))-1);
bin = right(bin, length(bin) - 1);
);
//to hex
thisbyte = right( hex( dec, "integer" ), 2 );
);
strout = strout || thisbyte;
);
//format output
substr(strout,1,8) ||
"-" || substr(strout,9,4) ||
"-" || substr(strout,13,4)||
"-" || substr(strout,17,4) ||
"-" || substr(strout,21,12);
);
newuuid();
Haftungsausschluss: Ich glaube, ich bin blind gefolgt dieser Link und ich habe keine umfangreichen Tests durchgeführt ...
Betreff: UUID-GeneratorAhh, ich verstehe.Aus demselben Grund
hextonumber("123e4567e89b12d3a456426655440001") == hextonumber("123e4567e89b12d3a456426655440000")
Tut mir leid, wenn das tatsächlich zwei verschiedene Fragen waren.
Betreff: UUID-GeneratorUnd die Antwort auf die Frage:
2.4249434048109e+37 ist eine Zahl mit doppelter Genauigkeit, die als Hexadezimalzahl auf der linken Seite Ihrer Frage dargestellt wird. Der große Hexadezimalwert auf der rechten Seite ist eine Ganzzahl, die ungefähr dem gleichen Wert entspricht. Um es genau darzustellen, wären viel mehr als 53 oder 64 Bit erforderlich.
Vielleicht sollte die Hex-to-Number-Funktion vor dem Präzisionsverlust warnen.@EvanMcCorkle
Betreff: UUID-GeneratorHaha. Ich muss das Zeug nachschlagen.Danke für die Hilfe.
Ich könnte davon ausgehen, dass der Benutzer über Powershell verfügt, und es einfach dadurch erreichen.Ich müsste allerdings ein Mac-Äquivalent schreiben.
Names default to here(1);
create_uuid = function({},
{DEFAULT LOCAL},
txt = "";
if(hostis("Windows"),
logtxt = logcapture(
txt = Run Program(executable("Powershell.exe"),
Options( {"[guid]::NewGuid()"} ),
ReadFunction( "text" )
);
);
, //else
throw("I don't think Apple has powershell");
);
if(txt != "",
uuid = regex(txt, "[\w\d]{8}-[\w\d]{4}-[\w\d]{4}-[\w\d]{4}-[\w\d]{12}");
return(uuid);
, // elif
Contains(logtxt, "RunProgram Error"),
throw(trim(logtxt));
, //else
throw("Couldn't find UUID");
);
);
create_uuid();
Betreff: UUID-GeneratorOK, wenn Sie ihm genau 16 hexadezimale Ziffern geben, wird versucht, ein IEEE-Double zu erstellen. Andernfalls wird eine Ganzzahl erstellt, wahrscheinlich im 53-Bit-Teil eines Doubles, und wenn mehr als etwa 53/4 (13?) Hexadezimalstellen vorhanden sind, verliert es an Präzision und wird angezeigt, als wäre es ein Double. Nichts davon ist für das, was Sie tun möchten, nützlich.
Betreff: UUID-GeneratorIch habe nicht versucht, es in eine andere Darstellung zu packen.Ich habe eigentlich nur versucht, mit einer zufälligen 128-Bit-Zahl zu testen, und festgestellt, dass zwei SEHR unterschiedlich große Hex-Strings die gleiche Zahl ergeben, und habe versucht herauszufinden, wie das geht.
Oder vielleicht prägnanter.Warum ist das wahr?
hextonumber("47B23E4567E89B13") == hextonumber("123e4567e89b12d3a456426655440000")Betreff: UUID-GeneratorEs sieht so aus, als hätten Sie bereits eine Guid und versuchen, diese in eine andere Darstellung zu packen.
guid = "123e4567-e89b-12d3-a456-426655440000";
guid = substitute(guid,"-","");
blob=hextoblob(guid);
show(hex(blob)); // "123E4567E89B12D3A456426655440000";
Es ist nicht möglich, die 16 Bytes in zwei 8-Byte-Doppeln aufzubewahren, ohne dass Probleme mit fehlenden Werten auftreten. Der 16-Byte-Blob (oder die 32-Zeichen-Hex-Darstellung) erscheint vernünftig. Ich glaube nicht, dass JMP eine Funktion zum Erstellen von Guids bereitstellt; Das Betriebssystem bildet sie normalerweise aus der MAC-Adresse Ihres Computers, der Tageszeit und möglicherweise einigen anderen Informationen, die sie nahezu eindeutig machen sollten.
HexToNumber in JSL verfügt über ein zweites Argument, das angibt, welche Art von Codierung das Hex darstellt. Ich denke, es könnte ein Sonderfall sein, wenn genau 16 Hexadezimalzeichen ein Double und kleiner oder gleich 8 eine 4-Byte-Ganzzahl sind.
Es kann hilfreich sein, den Blob (oben) in eine Matrix aus 1-Byte-Ganzzahlen ohne Vorzeichen zu laden, wenn Sie versuchen, die GUID in ihre Komponenten zu zerlegen. (blobToMatrix-Funktion). Sie könnten auch Ihren eigenen Leitfaden erstellen, https://superuser.com/questions/892700/is-there-a-way-to-get-only-the-ethernet-mac-address-via-command-prompt-in-window
https://en.wikipedia.org/wiki/Universally_unique_identifier