GUID jeb Globally unique identifier ir identifikators (ID), 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. Par nelaimi reiz izdomāju to izmantot vienā 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:

  1. 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.
  2. GUID var ģenerēt klienta pusē un sūtīt to serverim, paļaujoties uz to, ka šāds GUID (teorētiski) datubāzē nav. Līdz ar to, mums nav jāsūta serverim pieprasījums – izveido man ierakstu datubāzē un atūti tā ID, bet mēs izdarām sekojošu pieprasījumu: izveido datubāzē ierakstu ar manis dotu ID. Līz ar to mēs ar objektiem klienta pusē varam operēt tā it kā tie jau būtu izveidoti datubāzē.
  3. Šis gan nav tik svarīgs arguments, bet GUID’i sistēmai piedod nelielu 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:

  1. GUID aizņem 8 reizes vairāk vietas, ņemot vērā, ka jāglabā 32 simboli (256 biti), bet skaitļa (integer) identifikators aizņem tikai 4 baitus (32 bitus). Protams GUID’a izmērs atkarīgs no sistēmas un praktiski vienmēr tas būs lielāks kā 256 biti. Ir protams iespēja glabāt GUID’u kā 128 bitu skaitli, bet parasti gan tas tiek glabāts kā simbolu virkne.
  2. Tos ir grūti atcerēties (neiespējami?), līdz ar to datus ar roku rediģēt ir sarežģītāk.
  3. To ģenerēšana prasa zināmu laiku, un, ja tos jāģenerē pastāvīgi, 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 2 lietotāji, kas vienlaicīgi ieslēdz spēli ģenerē pilnīgi identiskus GUID’us (dēļ nejaušo skaitļu īpatnībām). Un šo faktoru protams nekādi nebija iespējams notestēt, kamēr bija tikai 10 testētāji, jo nekādi 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.

Diemžēl es šo mācību ieguvu the hard way, un nācās pakāst vairākas naktis, lai pārietu atpakaļ uz parastu skaitļu ID sistemu. Tāpēc iesaku jums mācīties no manām kļūdām un, ja sagribat izmantot GUID’us, pārliecināties vai jūsu izvēlētā tehnoloģija tiešām spēs ģenerēt pilnīgi unikālus GUID’us.