UUID e navegadores. Por que o frontend vive sem IDs feios?

Decidi fazer meu próprio projeto de estimação para contabilizar os livros lidos no PWA. Conquiste novas tecnologias e tudo isso. O cálculo era que eu iria postar e instalar no meu telefone, e agora tenho um aplicativo móvel que pode ser usado offline. Quero gerar um UUID para salvar a pasta de trabalho, não encontrar a API. Proponho descobrir por quê.







O que é UUID



UUID é um padrão de identificação de dados usado principalmente para sistemas distribuídos. Sua tarefa é permitir a geração de chaves que não causem conflitos quando salvas em um determinado armazém de dados.







O UUID é um número de 16 bytes no formato HEX:







xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx









Onde:







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





Aqui, não vou entrar em detalhes sobre o que isso significa. Você pode se familiarizar com isso em detalhes na Wikipedia .







Maneiras de gerar UUID









Todos os métodos para gerar UUIDs se resumem ao fato de que pegamos os dados exclusivos do cliente, os executamos por meio de uma função hash e obtemos nossa chave de 128 bits.







As versões 1 e 2 usaram o tempo com uma precisão de 0,1 microssegundos + endereço MAC, o que garantiu que quase não houvesse nenhuma maneira de obter uma duplicata. Para acabar com essa probabilidade, a primeira versão adiciona um salt aleatório e a segunda não faz nada (não gostamos da segunda versão, ela pode gerar apenas 64 ids únicos em sete 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 .







Quando os primeiros bytes da chave estão em ordem, é mais provável que um novo registro apareça no final da tabela. Mesmo se a sincronização for iniciada no cliente. Afinal, é improvável que o usuário sincronize os dados inseridos há seis meses e o SGBD desloque metade da tabela.







No caso de aleatoriedade, os dados serão inseridos na placa onde quer que cheguem.








All Articles