UUID dan browser. Mengapa frontend hidup tanpa ID jelek?

Saya memutuskan untuk melakukan proyek hewan peliharaan saya sendiri untuk akuntansi buku yang telah dibaca di PWA. Taklukkan teknologi baru dan semua itu. Perhitungannya adalah saya akan mempostingnya dan menginstalnya di ponsel saya, dan sekarang saya memiliki aplikasi seluler yang dapat digunakan secara offline. Saya ingin membuat UUID untuk menyimpan buku kerja, bukan menemukan API. Saya mengusulkan untuk mencari tahu mengapa.







Apa itu UUID



UUID adalah standar identifikasi data yang digunakan terutama untuk sistem terdistribusi. Tugasnya adalah mengaktifkan pembuatan kunci yang tidak akan menyebabkan konflik saat disimpan ke penyimpanan data tertentu.







UUID adalah angka 16-byte dalam format HEX:







xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx









Dimana:







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





Di sini saya tidak akan menjelaskan secara rinci apa artinya ini. Anda dapat membiasakan diri dengan ini secara mendetail di Wikipedia .







Cara untuk menghasilkan UUID









Semua metode untuk menghasilkan UUID bermuara pada fakta bahwa kami mengambil data unik klien, menjalankannya melalui fungsi hash dan mendapatkan kunci 128-bit kami.







Versi 1 dan 2 menggunakan waktu dengan akurasi 0,1 mikrodetik + alamat MAC, yang memastikan bahwa hampir tidak ada cara untuk mendapatkan duplikat. Untuk sepenuhnya menyelesaikan probabilitas ini, versi pertama menambahkan salt acak, dan yang kedua tidak melakukan apa-apa (kami tidak menyukai versi kedua, versi ini hanya dapat menghasilkan 64 id unik dalam tujuh menit).







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}

$$













.







" ?"



Ya, ada kode legendaris







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





Dalam kasus saya di backend, UUID digunakan sebagai .







Jika byte pertama dari kunci tersebut berurutan, kemungkinan besar record baru akan muncul di akhir tabel. Bahkan jika sinkronisasi dimulai pada klien. Bagaimanapun, kecil kemungkinan bahwa pengguna akan menyinkronkan data yang dimasukkan enam bulan lalu dan DBMS akan menggeser setengah dari tabel.







Dalam kasus keacakan, data akan dimasukkan ke dalam pelat di mana pun ia mendapatkannya.








All Articles