UUID et navigateurs. Pourquoi le frontend vit-il sans ID laids?

J'ai décidé de faire mon propre projet pour la comptabilité des livres lus sur PWA. Conquérir les nouvelles technologies et tout ça. Le calcul était que je le publierais et l'installerais sur mon téléphone, et maintenant j'ai une application mobile qui peut être utilisée hors ligne. Je souhaite générer un UUID pour enregistrer le classeur, sans trouver l'API. Je propose de comprendre pourquoi.







Qu'est-ce que l'UUID



UUID est une norme d'identification de données utilisée principalement pour les systèmes distribués. Sa tâche est de permettre la génération de clés qui ne causeront pas de conflits lors de leur enregistrement dans un magasin de données particulier.







L'UUID est un nombre de 16 octets au format HEX:







xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx









Où:







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





Ici, je n'entrerai pas dans les détails de ce que cela signifie. Vous pouvez vous familiariser avec cela en détail sur Wikipedia .







Façons de générer un UUID









Toutes les méthodes de génération d'UUID se résument au fait que nous prenons les données uniques du client, les exécutons via une fonction de hachage et obtenons notre clé de 128 bits.







Les versions 1 et 2 utilisaient le temps avec une précision de 0,1 microseconde + adresse MAC, ce qui garantissait qu'il n'y avait presque aucun moyen d'obtenir un duplicata. Pour terminer complètement cette probabilité, la première version ajoute un sel aléatoire, et la seconde ne fait rien (nous n'aimons pas la deuxième version, elle ne peut générer que 64 identifiants uniques en sept minutes).







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 .







Lorsque les premiers octets de la clé passent dans l'ordre, il est plus probable qu'un nouvel enregistrement apparaisse à la fin du tableau. Même si la synchronisation est lancée sur le client. Après tout, il est peu probable que l'utilisateur synchronise les données saisies il y a six mois et que le SGBD décale la moitié du tableau.







Dans le cas du caractère aléatoire, les données seront insérées dans la plaque où qu'elles soient.








All Articles