A GUID és az UUID
A GUID, a globálisan egyedi azonosító (Globally Unique Identifier) a microsoftos implentációja az UUID, az univerzálisan egyedi azonosító (Universally Unique Identifier) szabványára. Ez egy 16 byte hosszúságú álvéletlen szám (16 byte = 128 bit), ami 2128 variációt tesz lehetővé, ami nagyságrendileg 3.4 x 1038. Ez azért is nagy szám, mert pl. a látható univerzum átmérője 38.8 x 1026 méter, s így a fenti variációk száma tkp. egymilliárdszorosa annak, mint ahány milliméter az univerzum átmérője.
Azaz ha van sok dolgunk, s mindegyiknek akarunk adni egy egyedi azonosítót, akkor egyszerűen kap mindegyik egy ilyen álvéletlen számot. Mivel a variációk száma felfoghatatlanul nagyobb, mint a dolgok száma, így nem valószínű, hogy két dolog ugyanazt az azonosítót kapja. (Ami persze nem kizárható, de a valószínűsége gyakorlatilag 0.)
A szám generálása
A Microsoft egy 2005-ös dokumentuma szerint
4.1.4. Timestamp The timestamp is a 60-bit value. For UUID version 1, this is represented by Coordinated Universal Time (UTC) as a count of 100- nanosecond intervals since 00:00:00.00, 15 October 1582 (the date of Gregorian reform to the Christian calendar). (...) For UUID version 3 or 5, the timestamp is a 60-bit value constructed from a name as described in Section 4.3. For UUID version 4, the timestamp is a randomly or pseudo-randomly generated 60-bit value, as described in Section 4.4.
Azaz az implementáció a 128 bites szám előállításához generál egy 60 bites időbélyegzőt, ami megmondja, hogy 1582 október 15. óta hányszor 100 nanoszekundum (a másodperc milliárdod része) telt el. Ez pedig annak a dátuma, amikor XIII. Gergely pápa bevezette a róla elnevezett Gergely naptárt.
Gergely pápa naptárreformja
Előzőleg a Juliánus naptárt használták, amit Julius Caesar vezetett be, ahol egy év 365 napból állt, s minden negyedik szökőévben egy szökőnapot iktatott be. Így egy év 365.25 napból áll (365 nap és 6 óra). Ugyanakkor egy év valójában 365 nap 5 óra 48 perc 46 másodpercből áll, így a különbség évente 11 perc 14 másodperc. Ennek pedig az volt a következménye, hogy amikor a szökőévben az évhez hozzátoldjuk a szökőnapot, akkor még pluszban hozzáadjuk ennek az eltérésnek a négyszeresét, 44 perc 56 másodpercet. Ez pedig 128 év alatt egy napot eredményezett, azaz 128 évente mindig egy további nappal előrébb ugrik ugyanaz a dátum. S ebből eredően XIII. Gergely korára már 10 nap volt az eltérés, így a pápa az Inter Gravissimas kezdetű bullájával rendelte el, hogy 1582 október 4.-ét október 15.-e kövesse, s a köztük lévő napok abban az évben kimaradtak a naptárból.
Azt pedig, hogy a továbbiakban a 128 évente előálló napok ne torlódjanak fel, azt Gergely pápa egy szellemes megoldással előzte meg. Mivel ez 400 évente jelentett kb. 3 napot, ezért a 400-zal nem osztható kerek évszázadok nem számítanak szökőévnek. Így pl. 1900 nem volt szökőév, 2000 viszont igen.
A timestamp a generált UUID számban
A uuidgenerator.net oldalon az 1. verziószámú UUID generátorral generálok egy számot. Ez egy 128 bites hexadecimális szám lesz: 6fe16320–2eb4-11ec-8d3d-0242ac130003. Ebből a 60 bites időbélyegző: 1ec2eb46fe16320 A szabványnak megfelelően először az időbélyegző alsó bitjei, majd a középső bitjei, s végül a felső bitjei következnek a számsor elején. Az utolsó, a felső bitek szakasza egy 1-sel kezdődik, ami nem tartozik az időbélyegzőhöz, hanem a generáló UUID program verzióját jelzi. Azaz ez az érték az első verzióval készült.
UUID = time-low "-" time-mid "-" time-high-and-version "-" clock-seq-and-reserved clock-seq-low "-" node time-low = 4hexOctet time-mid = 2hexOctet time-high-and-version = 2hexOctet clock-seq-and-reserved = hexOctet clock-seq-low = hexOctet node = 6hexOctet
A timeanddate.com oldal szerint a Gregorián naptár bevezetése óta a poszt írásának a dátumáig 160 344 nap telt el. A fenti hexadecimális számot átváltva decimális számrendszerbe a következő értéket kapjuk: 138537041047675680. A UUID értéke szerint ennyiszer 100 nanomásodperc telt el azóta. Ezt átszámítva napokká, azt kapjuk, hogy az 160 343,79 nap. A két érték sacc/kábé még stimmel is.
A hexadecimális kódban az utolsó egység, a node mező – egy 12 számjegyű hexadecimális szám – a kódot generáló számítógép hálózati kártyájának a Mac addresse. Ez esetünkben nem a blogger gépének, hanem a neten a számot generáló programot futtató szerver gépének a fizikai címe.
Biztonsági probléma
Az 1. verziószámú UUID programmal létrehozott véletlenszámból tehát ki lehet olvasni az azt létrehozó számítógép Mac address-ét, ami biztonsági probléma, hiszen a világon minden hálózati kártya egyedi Mac address-t használ. Így a mai UUID generátorok már nem használják fel a Mac address-t a véletlenszám létrehozásához.
Annak idején ez a biztonsági rés vezetett el a Melissa vírus írójához. A vírus volt az első jelentősebb vírus, amely emailekben terjedt. A fertőzött levél tárgya: „Important Message From …”, szövege pedig: „Here is that document you asked for … don’t show anyone else 😉„, a mellékelt dokumentum pedig pornóoldalak listáját tartalmazta. A megfertőzött gép ezután ugyanezt a levelet továbbküldte a felhasználó kapcsolati listáján szereplő első 50 címnek. A vírus 1999. március 26-án kezdett el terjedni, s akkora forgalmat generált, hogy több nagy cég – köztük a Microsoft – levelezési rendszere leállt. S a fenti biztonsági rés vezetett el a vírus írójához, ugyanis a víruskód tartalmazott egy GUID számot, amelyből így ki lehetett olvasni a vírust író személy gépének a Mac address-ét.