GUID jeb Globally unique identifier ir identifikators, kas (teorētiski) ir unikāls vienmēr un visur. To parasti lieto, lai identificētu dažādus sistēmas elementus, piemēram, datubāzes ierakstus. Reiz es izdomāju to izmantot arī kādā no savām spēlēm, kas sastāvēja no PHP servera un Flash kliena.Izstāstīšu, kādi bija mani (un arī citu programmētaju) apsvērumi to izmantot:
- GUID ir vienmēr unikāls gan vienas tabulas ietvaros, gan arī visas datubāzes ietvaros t.i. ja kādam lietotājam tiek piešķirts GUID, tad neviens cits objekts spēlē nebūs ar šādu GUID’u.
- GUID var ģenerēt klienta pusē un sūtīt to serverim, paļaujoties uz to, ka šāda GUID datubāzē nav. Līdz ar to mums nav jāsūta serverim pieprasījums izveidot ierakstu datubāzē un atūtīt tā ID, bet mēs izdarām sekojošu pieprasījumu: izveido datubāzē ierakstu ar manis dotu ID. Tas ļauj mums ar objektiem klienta pusē operēt tā it kā tie jau būtu izveidoti datubāzē.
- Šis gan nav tik svarīgs arguments, bet GUID’i sistēmai piedod aizsardzību, jo tos uzminēt ir praktiski neiespējami.
GUID izmantošanai, protams, ir arī daži mīnusi, bet par galveno trūkumu pastāstīšu vēlāk:
- Ja GUID glabā kā tekstu, tas aizņem 8 reizes vairāk vietas, jo jāglabā 32 simboli (256 biti), kamēr skaitļa (integer) identifikators aizņem tikai 4 baitus (32 bitus). Protams, 32 baitu virknes izmērs atkarīgs no sistēmas, un praktiski vienmēr tas būs lielāks par 256 bitiem. Ir, protams, iespēja glabāt GUID’u kā 128 bitu skaitli, bet mana datubāze to neatbalstīja.
- Tos ir grūti atcerēties (neiespējami?), līdz ar to datus ar roku rediģēt ir sarežģītāk.
- To ģenerēšana prasa zināmu laiku, un, ja tos jāģenerē regulāri, tad ģenerācija var nedaudz noslogot procesoru.
Pirmais punkts lika par sevi manīt praktiski uzreiz pēc projekta palaišanas, kad līdz ar katra jauna ieraksta izveidošanu datubāzē, tā auga nekontrolējamā ātrumā, un jau pāris dienu laikā pēc projekta palaišanas sasniedza 7 gigabaitu izmēru.
Taču pati lielākā vilšanās ar GUID’iem sekoja, kad atklājās, ka Flash’ā nejaušo (random) skaitļu ģenerators ņem vērā tikai datora pulksteni, un to nav iespējams randomizēt. Līdz ar to divi lietotāji, kas vienlaicīgi ieslēdz spēli, ģenerē pilnīgi identiskus GUID’us, jo nejaušo skaitļu sēkla tiem ir vienāda. Un šo faktoru protams nebija iespējams notestēt, kamēr bija tikai 10 testētāji, jo nevarējām ieslēgt spēli vienā un tajā pašā milisekundē. Bet jau pie pāris tūkstošiem lietotāju dienā šādas situācijas sāka kļūt aizvien biežākas, un tas pilnībā sabojāja visu datubāzi.
Risinājums šai problēmai ir rakstīt savu nejaušo skaitļu ģenerātoru, un kā sēklu izmantot ne tikai laiku, bet papildus tam vēl, piemēram, peles kursora pozīciju, lietotāja identifikācijas numuru, klienta IP adresi u.c. Diemžēl es šo mācību ieguvu the hard way, un nācās patērēt vairākas naktis, lai to visu salabotu. Tāpēc iesaku jums mācīties no manām kļūdām, un, ja izdomājat izmantot GUID’us, pārliecināties, vai jūsu izvēlētā tehnoloģija tiešām spēs ģenerēt pilnīgi unikālus identifikātorus.