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. , , .

.
- . .
- .
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); }); }
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.