Անհրաժեշտ է այնպիսի նույնացուցիչ, որը չի բախվի մեկ ուրիշի կողմից ստեղծվածի հետ, այն էլ մի սարքի վրա, որի մասին երբևէ չեք լսել, և այն էլ առանց որևէ մեկից թույլտվություն հարցնելու։ Հենց սա է UUID-ի գործառույթը։ Դա 128-բիթանոց թիվ է, որը գրվում է որպես 36 նիշ ծանոթ 8-4-4-4-12 ձևաչափով, և դրա ողջ կառուցվածքն այնպիսին է, որ դրանցից ոչ մի երկուսը նույնը չեն լինի, նույնիսկ եթե ոչինչ չի համակարգում, թե ով որն է ստանում։ Այս անվճար գեներատորը ստեղծում է դրանք ձեր բրաուզերում. ընտրեք տարբերակ «Տարբերակ» դաշտում, նշեք, թե քանիսն է ձեզ անհրաժեշտ «Քանակ»-ում և սեղմեք «Ստեղծել»։ Էջը բացվում է մեկ հատ v4-ով, որն այն տարբերակն է, որն անհրաժեշտ է նախագծերի մեծ մասին, այնպես որ առաջին նույնացուցիչը հասանելի է ընդամենը մեկ սեղմումով։
Յուրաքանչյուր նույնացուցիչ ստեղծվում է ձեր բրաուզերի կողմից Web Crypto API-ի միջոցով։ Տարբերակ 4-ը օգտագործում է crypto.randomUUID(), երբ բրաուզերն այն տրամադրում է, հակառակ դեպքում՝ crypto.getRandomValues(), ինչը գաղտնագրականորեն ուժեղ պատահականության աղբյուր է, այլ ոչ թե JavaScript-ի պսևդո-պատահական ֆունկցիա, ինչպիսին է Math.random()-ը։ Տարբերակ 7-ը սկզբում տեղադրում է 48-բիթանոց միլիվայրկյանային ժամանակային դրոշմ, այնուհետև 12-բիթանոց հաշվիչ, որն աճում է նույն միլիվայրկյանի ընթացքում, այնուհետև 62 պատահական բիթ. սա դասավորման մեթոդն է, որը նկարագրված է RFC 9562-ում։ Այդ հաշվիչն է պատճառը, որ հազարավորներից բաղկացած խմբաքանակը ստացվում է հերթականությամբ, այլ ոչ թե խառնված։ Տարբերակ 1-ը համատեղում է ժամանակային դրոշմը պատահական հանգույցի նույնացուցիչի հետ, որի խմբային հեռարձակման բիթը միացված է, ուստի այն երբեք չի կրում ձեր ցանցային քարտի հասցեն այնպես, ինչպես 1990-ականների բնօրինակ իրականացումներն էին անում։ Տարբերակներ 3-ը և 5-ը ընդհանրապես պատահական չեն. նրանք միասին հեշավորում են անվանատարածքը և անունը՝ օգտագործելով համապատասխանաբար MD5 և SHA-1, և այդ հեշավորումը նույնպես տեղի է ունենում ձեր սարքում։ Ոչինչ չի ուղարկվում սերվերին, ոչինչ չի գրանցվում, և երբ էջը բեռնվում է, այն շարունակում է աշխատել անգամ առանց ինտերնետ կապի։
«Տարբերակ»-ն այն դաշտն է, որը որոշում է մնացած ամեն ինչը։ Տարբերակ 4-ը 122 պատահական բիթ է և չունի որևէ կառուցվածք՝ լռելյայն տարբերակն է և ճիշտ պատասխանը, երբ նույնացուցիչը պետք է լինի միայն եզակի։ Տարբերակ 7-ը պահպանում է 62 պատահական բիթ, բայց սկսվում է ստեղծման ժամանակով, այնպես որ դրանց բազմությունը դասավորվում է ստեղծման հերթականությամբ. հենց դա է պատճառը, որ այն պետք է ընտրել, երբ նույնացուցիչը դառնալու է տվյալների բազայի բանալի։ Տարբերակ 1-ը բնօրինակ ժամանակի վրա հիմնված սխեման է, որն այստեղ պահպանվել է այն համակարգերի համար, որոնք դեռ պահանջում են այն։ Տարբերակներ 3-ը և 5-ը տարօրինակ զույգ են. դրանք դետերմինիստական են, ինչը նշանակում է, որ նույն մուտքային տվյալները միշտ տալիս են նույն նույնացուցիչը, և դրանք պահանջում են երկու լրացուցիչ դաշտ՝ «Անվանատարածք», որը ստանդարտ DNS, URL, OID և X.500 տարածքներից մեկն է կամ ձեր սեփական «Հատուկ» տարածքը, և «Անուն», որը նույնականացվող տողն է։ Տրամադրեք v5-ին URL անվանատարածք և https://example.com/a, և դուք կստանաք նույն UUID-ն այսօր, վաղը և մեկ ուրիշի սարքի վրա։ Այդ պատճառով, «Քանակ» դաշտը անհետանում է, երբ ընտրվում է v3 կամ v5. մեկ դետերմինիստական արժեքի հազար օրինակը կլինի պարզապես մեկ դետերմինիստական արժեքի հազար օրինակ։ Բոլոր այլ տարբերակների համար «Քանակ»-ը կարող է լինել 1-ից մինչև 1000։
Չորս անջատիչ փոխում են արդյունքի տեսքը՝ չփոխելով տակը գտնվող 128 բիթերը։ «Մեծատառ»-ը տպում է տասնվեցական նիշերը մեծ տառերով, «Առանց գծիկների»-ն տալիս է կոմպակտ 32 նիշանոց ձևաչափը, որը նախընտրում են որոշ սյունակներ և ֆայլերի անուններ, իսկ «Ձևավոր փակագծեր»-ը արժեքը վերցնում է { }-ի մեջ՝ այն ձևով, ինչպես Windows-ի և .NET-ի աշխարհը դա անվանում է GUID։ «Ընդլայնված Կարգավորումներ»-ի տակ գտնվող urn:uuid:-ն ավելացնում է նախածանց, որն այն դարձնում է ֆորմալ URN։ Երբ այն միացված է, անջատում է «Ձևավոր փակագծեր» և «Առանց գծիկների» տարբերակները, քանի որ ստանդարտը թույլ է տալիս ճիշտ մեկ URN ձևաչափ, որը կանոնական գծիկներով ձևն է։ «Պատճենման ձևաչափ»-ը որոշում է, թե ինչպես է խմբաքանակը միացվում, երբ այն վերցնում եք. մեկական յուրաքանչյուր տողում, բաժանված ստորակետերով, կամ յուրաքանչյուր արժեքը չակերտների մեջ՝ վերջում ստորակետով, ինչը թույլ է տալիս այն անմիջապես տեղադրել ծրագրային կոդի զանգվածի մեջ։ Արդյունքի տակ կա մի տող, որը զեկուցում է պատահականության մասին բիթերով՝ 122 v4-ի համար, 62 v7-ի համար, իսկ v7-ի համար՝ խմբաքանակի առաջին նույնացուցիչում գաղտնագրված ժամանակային դրոշմը, այնպես որ արժեքի ներսում ժամանակը տեսանելի է, ոչ թե ենթադրվող։ «Պատճենել բոլորը» և «Պահպանել ֆայլում» կոճակները երկուսն էլ հարգում են «Պատճենման ձևաչափ»-ը։ «Պատմություն»-ը պահում է ձեր վերջին 10 խմբաքանակները ձեր բրաուզերում. սեղմեք մեկի վրա՝ այն վերադարձնելու համար, պատճենեք կամ ջնջեք մեկ գրառում, կամ մաքրեք ամեն ինչ։ «Մաքրել»-ը դատարկում է արդյունքը և անփոփոխ է թողնում ձեր կարգավորումները, և 50 նույնացուցիչից հետո ցանկը դառնում է մեկ ոլորվող բլոկ՝ հիսուն առանձին տողերի փոխարեն։
Այս էջի ամենակարևոր բանը v4-ի և v7-ի միջև եղած տարբերությունն է որպես հիմնական բանալի, և դա ճաշակի հարց չէ։ Տվյալների բազայի ինդեքսները ծառեր են, որոնք պահվում են դասավորված կարգով, և թե որտեղ է ընկնում նոր բանալին այդ հերթականության մեջ, որոշում է, թե որքան աշխատանք է պահանջում ավելացումը։ v4 բանալին պատահական է, ուստի հաջորդական ավելացումները հայտնվում են ինդեքսի միմյանց հետ կապ չունեցող անկյուններում. էջերը, որոնք լիքն էին, բաժանվում են, ծառի այն մասերը, որոնք տվյալների բազան պահում է հիշողության մեջ, հազվադեպ են այն մասերը, որոնք հաջորդ ավելացմանն անհրաժեշտ են, և արդյունքում ինդեքսը դառնում է ավելի մեծ ու հատվածավորված, քան արդարացնում են դրա ցույց տված տողերը։ v7 բանալին սկսվում է ընթացիկ միլիվայրկյանով, ուստի հաջորդական ավելացումները հայտնվում են իրար կողքի ծառի աջ եզրում, ինչն այն օրինաչափությունն է, որը ստեղծում է ավտոմատ աճող ամբողջ թիվը, և հենց այդ օրինաչափության շուրջ են կառուցվել ինդեքսի կառուցվածքները։ Սա է ողջ փոխզիջումը. v7-ը տալիս է հաջորդական բանալու ավելացման վարքագիծ՝ պահպանելով այն հատկությունը, որի համար դուք ի սկզբանե ընտրել եք UUID-ներ, այն է՝ յուրաքանչյուրը կարող է ստեղծել այն առանց սերվերին հարցնելու։ Դրա գինն այն է, որ ստեղծման ժամանակն այժմ ընթեռնելի է նույնացուցիչի ներսում, և արդյոք դա կարևոր է, թե ոչ, ձեր տվյալների մասին հարց է, այլ ոչ թե ձևաչափի։
Ոչինչ երբևէ չի ստուգում UUID-ի եզակիությունը. դրա չափն է դրա երաշխիքը։ Գոյություն չունի ռեգիստր, սերվերի հետ կապ, որոնում՝ գեներատորն արտադրում է թիվ և հանձնում այն, և պատճառը, որ դրանցից երկուսը չեն բախվում, պարզապես այն է, որ կան 2^122 հնարավոր v4 արժեքներ՝ մոտ 5.3 × 10^36։ Ծննդյան խնդիրը սա գնահատելու ամենաազնիվ ճանապարհն է. ձեզ անհրաժեշտ կլիներ մոտ 2.7 × 10^18 նույնացուցիչ, մինչև որևէ երկուսի համընկնելու հավանականությունը կկազմեր 50%, ինչը հավասար է 86 տարի շարունակ ամեն վայրկյան մեկ միլիարդ նոր UUID-ի ստեղծման։ Արժե ճշգրիտ լինել այն հարցում, թե ինչ է դա խոստանում և ինչ՝ ոչ։ Դա վիճակագրական երաշխիք է, ոչ թե թվաբանական, և այն գործում է միայն այնքան ժամանակ, քանի դեռ հիմքում ընկած պատահականությունն իրական է. վատ սկզբնավորված գեներատորը կամ վիրտուալ մեքենան, որը կլոնավորվել է իր էնտրոպիայի ավազանի հետ միասին, կոտրում է այն այնպես, որ ձևաչափը չի կարող հայտնաբերել։ Տարբերակ 7-ն ավելի է նեղացնում այս հարցը. մեկ միլիվայրկյանի ընթացքում գեներատորը ընդհանրապես չի կարող կրկնել ինքն իրեն, քանի որ հաշվիչն աճում է՝ զառ նետելու փոխարեն, և անկախ գեներատորների միջև աշխատում են 62 պատահական բիթերը։
UUID-ն նույնացուցիչ է, ոչ թե գաղտնաբառ։ Տարբերակ 4-ը անկանխատեսելի է, և դա գայթակղում է մարդկանց վերաբերվել դրան որպես գաղտնիքի՝ որպես գաղտնաբառի վերականգնման հղում, անկանխատեսելի URL, սեսիայի թոքեն, API բանալի։ Անկանխատեսելիությունն իրական է, բայց գաղտնիությունը այն բանի հատկությունն է, թե ինչպես են վարվում արժեքի հետ, իսկ նույնացուցիչների հետ կանխամտածված անզգույշ են վարվում. դրանք հայտնվում են URL-ներում, որոնք պահվում են բրաուզերի պատմության, սերվերի տեղեկամատյանների, referrer վերնագրերի և վերլուծական համակարգերի մեջ, ինչպես նաև պատճենվում են զրույցների հաղորդագրություններում։ Մյուս տարբերակներն էլ ավելի վատ թեկնածուներ են։ Տարբերակ 1-ը և տարբերակ 7-ը երկուսն էլ գաղտնագրում են ստեղծման պահը, ուստի յուրաքանչյուր ոք, ով տիրապետում է դրան, մոտավորապես գիտի, թե երբ է այն ստեղծվել, և կարող է նեղացնել դրա հետ ստեղծված ամեն ինչի շրջանակը։ Տարբերակներ 3-ը և 5-ը կանխամտածված դետերմինիստական են. էլեկտրոնային հասցեի v5 UUID-ն հեշավորված գաղտնիք չէ, այն մի արժեք է, որը նույն հասցեով ցանկացած մարդ կարող է հաշվարկել մեկ վայրկյանում։ Օգտագործեք UUID-ն ինչ-որ բան անվանելու համար։ Երբ արժեքը պետք է անհայտ մնա, օգտագործեք գաղտնաբառերի գեներատոր կամ գաղտնիքների համար ստեղծված գրադարանի թոքեն։
Ինչու՞ ընտրել այս UUID գեներատորը.
- Ստեղծում միայն բրաուզերում. նույնացուցիչները ստեղծվում են ձեր սարքում և երբեք ոչ մի տեղ չեն ուղարկվում
- Web Crypto API-ի պատահականություն. գաղտնագրականորեն ապահով, այլ ոչ թե Math.random()
- Հինգ տարբերակ մեկ վայրում. v1, v3, v4, v5 և v7՝ առանց գործիքներ փոխելու
- Իրականում դասավորված v7. միլիվայրկյանի ներսում գործող հաշվիչ, ինչպես նկարագրված է RFC 9562-ում
- Դետերմինիստական v3 և v5՝ չորս ստանդարտ անվանատարածքներով կամ ձեր սեփականով
- Մինչև 1000 հատ միանգամից, հիսունից հետո՝ կոմպակտ ոլորվող ցուցակով
- Յուրաքանչյուր տարածված ձևաչափ. գծիկներով, մերկ, մեծատառ, փակագծերով կամ որպես urn:uuid: URN
- Պատճենում որպես տողեր, ստորակետերով կամ չակերտներում՝ ծրագրային կոդում անմիջապես տեղադրելու համար
- Անսահմանափակ և անվճար. գրանցում չկա, օգտագործման սահմանափակումներ չկան, մեր սերվերներում ոչինչ չկա
UUID-ները հայտնվում են այնտեղ, որտեղ ինչ-որ բան պետք է անվանվի, նախքան որևէ մեկը կկարողանա հաստատել, որ անունն ազատ է։ Հավելվածի կոդը ստեղծում է դրանք այն տողերի համար, որոնք պատրաստվում է ավելացնել, այնպես որ օբյեկտը ունի ինքնություն նախքան տվյալների բազա հասնելը, իսկ հաճախորդը կարող է հղում կատարել դրան, մինչդեռ գրանցումը դեռ ընթացքի մեջ է։ Բաշխված համակարգերը դրանց վրա ավելի շատ են հենվում. մի քանի ծառայություններ, որոնք գրում են մեկ աղյուսակում, ինքնաթիռում օֆլայն գրառումներ ստեղծող բջջային հաճախորդ, հերթ, որը պետք է ճանաչի արդեն իսկ մշակված հաղորդագրությունը՝ սրանցից ոչ մեկը չի կարող սպասել իր հերթին ընդհանուր հաշվիչի համար։ Տարբերակ 5-ը ծածկում է մեկ այլ կարիք, այն է՝ կայուն նույնացուցիչ, որը ստացվում է ձեր ունեցած ինչ-որ բանից. միևնույն փաստաթուղթը, միևնույն URL-ը կամ միևնույն հաշիվը միշտ քարտեզագրվում են նույն UUID-ին, ուստի ներմուծումը կարող է աշխատել երկու անգամ՝ առանց որևէ բան կրկնօրինակելու։ Այլուր դրանք պարզապես այն ձևաչափն են, որը համակարգը պահանջում է՝ տեղեկամատյաններում ու հետքերում միահյուսված կապակցման նույնացուցիչ, ֆայլի անուն, որը չի բախվի, երբ հազարավոր օգտատերերի վերբեռնումները հայտնվեն մեկ պահոցում, Windows-ի ռեգիստրի բանալի, թեստային տվյալներ, որոնք պետք է իրական տվյալների նման լինեն։
Մի քանի անկեղծ սահմանափակումներ արժե իմանալ։ Մեկ խմբաքանակը մեկ տարբերակ է. «Տարբերակ»-ում ընտրված արժեքը վերաբերում է դրա մեջ գտնվող ամեն ինչին, ուստի v4-ների և v7-ների հերթականությունները երկու առանձին խմբաքանակներ են։ Սա գեներատոր է, այլ ոչ թե տեսուչ. UUID տեղադրելը՝ դրա տարբերակը կամ ժամանակային դրոշմը կարդալու համար այն չէ, ինչ այս էջն անում է։ «Պահպանել ֆայլում»-ը գրում է պարզ տեքստային ֆայլ՝ CSV կամ JSON-ի փոխարեն։ Տարբերակ 7-ը բացահայտ ցույց է տալիս, թե երբ է այն ստեղծվել՝ մինչև միլիվայրկյանի ճշտությամբ, ինչը իրական փոխզիջում է, այլ ոչ թե թերություն, իսկ տարբերակ 1-ը արտահոսում է ժամանակը նույն ձևով։ Եթե դա խնդիր է ձեր տվյալների համար, տարբերակ 4-ը այն տարբերակն է, որը ոչ ոքի ոչինչ չի ասում։ Ստանդարտի երկու հատուկ արժեքներ տարբերակներ չեն և հետևաբար որպես ընտրանքներ չեն ներկայացված «Տարբերակ»-ում, բայց դուք կարող եք դրանք պատճենել այստեղից. զրոյական UUID՝ 00000000-0000-0000-0000-000000000000, և առավելագույն UUID՝ ffffffff-ffff-ffff-ffff-ffffffffffff։ Այս էջի ամեն ինչ հետևում է RFC 9562-ին, այն ստանդարտին, որը 2024 թվականին փոխարինեց RFC 4122-ին, ուստի արդյունքն ընդունվում է ցանկացած գրադարանի, տվյալների բազայի կամ API-ի կողմից, որն ընդհանրապես աշխատում է UUID-ների հետ։ Այդ սահմանափակումների ներքո երաշխիքը ուժեղ է. յուրաքանչյուր նույնացուցիչ կառուցված է ստանդարտին համապատասխան, գաղտնագրականորեն անվտանգ պատահականությունից, ձեր սեփական համակարգչի վրա, և ուրիշ ոչ ոք այն երբեք չի տեսնում։