UUID y navegadores. ¿Por qué frontend vive sin ID desagradables?

Decidí hacer mi propio proyecto favorito para la contabilidad de libros leídos en PWA. Conquista las nuevas tecnologías y todo eso. El cálculo fue que lo publicaría e instalaría en mi teléfono, y ahora tengo una aplicación móvil que se puede usar sin conexión. Quiero generar un UUID para guardar el libro de trabajo, no encontrar la API. Propongo averiguar por qué.







Que es UUID



UUID es un estándar de identificación de datos que se utiliza principalmente para sistemas distribuidos. Su tarea es permitir la generación de claves que no causen conflictos cuando se guarden en un almacén de datos en particular.







El UUID es un número de 16 bytes en formato HEX:







xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx









Dónde:







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





Aquí no entraré en detalles de lo que esto significa. Puede familiarizarse con esto en detalle en Wikipedia .







Formas de generar UUID









Todos los métodos para generar UUID se reducen al hecho de que tomamos los datos únicos del cliente, los ejecutamos a través de una función hash y obtenemos nuestra clave de 128 bits.







Las versiones 1 y 2 usaron el tiempo con una precisión de 0.1 microsegundos + dirección MAC, lo que aseguró que casi no hubiera forma de obtener un duplicado. Para terminar completamente con esta probabilidad, la primera versión agrega una sal aleatoria y la segunda no hace nada (no nos gusta la segunda versión, puede generar solo 64 identificadores únicos en siete minutos).







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 .







Cuando los primeros bytes de la clave van en orden, es más probable que aparezca un nuevo registro al final de la tabla. Incluso si la sincronización se inicia en el cliente. Después de todo, es poco probable que el usuario sincronice los datos ingresados ​​hace seis meses y el DBMS cambiará la mitad de la tabla.







En el caso de aleatoriedad, los datos se insertarán en la placa donde sea que llegue.








All Articles