UUID und Browser. Warum lebt das Frontend ohne hässliche Ausweise?

Ich beschloss, mein eigenes Haustierprojekt für die Buchhaltung von gelesenen Büchern über PWA durchzuführen. Erobern Sie neue Technologien und all das. Die Berechnung war, dass ich es veröffentlichen und auf meinem Telefon installieren würde, und jetzt habe ich eine mobile Anwendung, die offline verwendet werden kann. Ich möchte eine UUID generieren, um die Arbeitsmappe zu speichern, nicht die API finden. Ich schlage vor herauszufinden, warum.







Was ist UUID?



UUID ist ein Datenidentifikationsstandard, der hauptsächlich für verteilte Systeme verwendet wird. Seine Aufgabe besteht darin, die Generierung von Schlüsseln zu ermöglichen, die beim Speichern in einem bestimmten Datenspeicher keine Konflikte verursachen.







Die UUID ist eine 16-Byte-Nummer im HEX-Format:







xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx









Wo:







x - [0 - f] ( )
M - [0 - 5] ( UUID)
N - [8 - b] ( UUID)
      
      





Ich werde hier nicht näher darauf eingehen, was dies bedeutet. Sie können sich auf Wikipedia ausführlich damit vertraut machen .







Möglichkeiten zum Generieren von UUID









Alle Methoden zum Generieren von UUIDs beschränken sich auf die Tatsache, dass wir die eindeutigen Daten des Clients verwenden, sie über eine Hash-Funktion ausführen und unseren 128-Bit-Schlüssel erhalten.







In den Versionen 1 und 2 wurde die Zeit mit einer Genauigkeit von 0,1 Mikrosekunden + MAC-Adresse verwendet, wodurch sichergestellt wurde, dass es fast keine Möglichkeit gab, ein Duplikat zu erhalten. Um diese Wahrscheinlichkeit vollständig zu beenden, fügt die erste Version ein zufälliges Salz hinzu und die zweite tut nichts (wir mögen die zweite Version nicht, sie kann nur 64 eindeutige IDs in sieben Minuten generieren).







3 5 (Url, FQDN, OID) + . UUID .







3 5 , 3 MD-5, 5 — SHA-1.

4 ¯_(ツ)_/¯.









JS



MAC- , IP, - .

, file- , , . , UUID . .

: , , :













import * as console from 'console';

console.run('rm -rf /**/kursach*final-(\d+)?.docx')
      
      





.









, .

. — . — UUID . , ID , , .







, PWA, 2007 . , PWA , , . ( Play Market PWA , ...). , PWA ? .







— API getUUID()



, ? , 99 100 - .







.











.







, UUID 100 .







1 , ( performance.now()



), .









.







HTML Living Standard The Navigator object.







,







appCodeName appName platform ​product productSub vendor vendorSub
Chrome Mozilla Netscape Win32 Gecko 20030107 Google Inc. -
Mozilla 75 Mozilla Netscape Win32 Gecko 20100101 - -
Mozilla 45 Mozilla Netscape Win32 Gecko 20100101 - -
Internet Explorer Mozilla Netscape Win32 Gecko - - -
Microsoft Edge Mozilla Netscape Win32 Gecko 20030107 Google Inc. -


? ? .







, userAgent



appVersion



:







appVersion userAgent
Chrome 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36
Mozilla 75 5.0 (Windows) Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0
Mozilla 45 5.0 (Windows) Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Internet Explorer 5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0; Zoom 3.6.0; rv:11.0) like Gecko Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0; Zoom 3.6.0; rv:11.0) like Gecko
Microsoft Edge 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 Edg/88.0.705.74 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 Edg/88.0.705.74


Edge , IP, . Edge. , , .















.







  1. . .
  2. .


6 16 timestamp', 10889-08-0210:31:50.655



. .







6 SHA-1 — 281,474,976,710,656 ( , ). ( 30).







1 (M) (N).







3 .







:







- 100,000 100 , :







$$

100,000 * 100 / 60,000 = 166

$$







, :







$$

166 1/256^3 1/256^5 = 166 1/255^8 = 166 / 18 10^{18}

$$













.







" ?"



,







function uuidv4() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
}
      
      





UUID .







Wenn die ersten Bytes des Schlüssels in der richtigen Reihenfolge angezeigt werden, wird am Ende der Tabelle mit größerer Wahrscheinlichkeit ein neuer Datensatz angezeigt. Auch wenn die Synchronisation auf dem Client gestartet wird. Schließlich ist es unwahrscheinlich, dass der Benutzer die vor sechs Monaten eingegebenen Daten synchronisiert und das DBMS die Hälfte der Tabelle verschiebt.







Im Falle einer Zufälligkeit werden die Daten überall in die Platte eingefügt.








All Articles