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

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