متوفر أيضًا بلغات أخرى: English · Español · Português · Français
مولّد ULID وفاكّ ترميزه
معرِّفات مرتَّبة تحمل وقتها: تصاعدية افتراضيًا، وتُفكّ بالفحوص التي يتخطاها أغلب الأدوات.
ما معرِّف ULID؟
ULID معرِّف من ستة وعشرين محرفًا يحمل في داخله وقت إنشائه. المحارف العشرة الأولى عدّاد من 48 بتًا للميلي ثانية منذ عام 1970، والستة عشر الباقية 80 بتًا من العشوائية. ويُكتب الشطران بترميز base32 عند كروكفورد، وهي أبجدية من عشرة أرقام واثنين وعشرين حرفًا تُسقط I وL وO وU لأنها الحروف التي يُخطئ الناس في قراءتها.
وفائدة تقديم الساعة أن ترتيب النص يرتّب حسب الوقت. فالـUUID من النسخة الرابعة محضُ عشوائية، فالجدول المفهرَس عليه يبعثر كتاباته في الفهرس كله، بينما تُبقي المعرِّفات المتصاعدة الصفوفَ الجديدة متجاورة. وهذا نفسه ما دفع إلى UUID النسخة السابعة التي قنّنها معيار RFC 9562 سنة 2024، وهي الخيار الأفضل متى أمكن استعمالها؛ أما ULID فسبقها، وليس معيارًا لدى IETF، وتُعرف أساسًا لأن برمجيات كثيرة تصدره بالفعل.
ويصلح هذا الشكل حيث لا يصلح الـUUID: ستة وعشرون محرفًا مقابل ستة وثلاثين، بلا شرطات، ولا يفرّق بين كبير الحروف وصغيرها، ويحتمل الإملاء أو النقل اليدوي عن الشاشة أفضل بكثير من الست عشري.
كيف تستعمله
- اختر العدد الذي تريده وانسخه. حتى مئة دفعةً واحدة، مسحوبة من مصدر العشوائية المعمّى في متصفحك. انسخ واحدًا أو الدفعة كلها سطرًا سطرًا.
- أبقِ مربع الترتيب مؤشَّرًا ما لم تكن تعلم أنك تريد إلغاءه. فهو يجعل المعرِّفات المولَّدة في الجزء الواحد من الألف من الثانية تتصاعد بدل أن تُسحب مستقلةً، وهذا ما يجعل الدفعة مرتَّبة بترتيب إنشائها.
- الصق أي معرِّف في الحقل الثاني لتقرأه. تحصل على لحظة الإنشاء بتوقيتك المحلي، والشطر العشوائي، والصيغة المعيارية، والبتات نفسها مكتوبةً بالست عشري.
ثلاثة أشياء تخطئ فيها أدوات ULID الأخرى
أولها أن دفعة المعرِّفات لا تكون مرتَّبة في الغالب. فستة وعشرون محرفًا من base32 لا تستقيم في الترتيب إلا إذا تصاعدت القيم خلفها، ومعرِّفان أُنشئا في الجزء نفسه من الألف من الثانية يتشاركان الطابع الزمني، فيقرّر ترتيبَهما الشطرُ العشوائي. وسحبتان مستقلتان متساويتان في الاحتمال في الاتجاهين، أي إنها قرعة بحكم البناء لا خللٌ عارض، وهذا ما تقوله القياسات: على 20,000 نداء داخل جزء واحد من الألف من الثانية، جاءت نسبة الترتيب الخاطئ 49.9 و49.6 و50.2 بالمئة لثلاثة تدفقات عشوائية مختلفة، و49.6 و50.1 بالمئة في جولتين على التنفيذ المرجعي بلغة جافاسكربت في الزمن الحقيقي. أما مصنعه التصاعدي فيجعلها صفرًا في كل مرة. ولمّا كان الترتيب هو كل سبب تفضيل هذا الشكل، فهو هنا مفعَّل افتراضيًا، ومربعُ اختيار لا افتراضٌ ضمني.
وثانيها التجاوز. فستة وعشرون محرفًا من base32 تحمل 130 بتًا، والمعرِّف 128، فلا يكون المحرف الأول إلا من 0 إلى 7؛ وأكبر معرِّف ممكن هو 7ZZZZZZZZZZZZZZZZZZZZZZZZZ. وتقول المواصفة إن أي محاولة لفكّ معرِّف أكبر يجب أن تُرفض في كل التنفيذات، تحديدًا منعًا لعلل التجاوز. وبتجربة المحارف الأولى الاثنين والثلاثين الممكنة على التنفيذ المرجعي، يعيد مدقّقه «صحيح» في كلها بينما يرمي فاكّه خطأً في أربعة وعشرين منها: ثلاثة أرباع السلاسل التي يسمّيها صحيحة ليست معرِّفات ULID. وهنا لهذه الحالة حكمها الخاص بدل أن تمرّ بلا تنبيه.
وثالثها النقل باليد. فقد صمّم كروكفورد هذه الأبجدية ليمكن استرجاع الحروف المستبعَدة عند القراءة: تُفكّ I وL على أنها 1، وO على أنها 0، ولا يُلتفت إلى حجم الحرف. أما التنفيذ المرجعي فيرفض الثلاثة جميعًا، ويشحن دالة إصلاح منفصلة عليك أن تناديها بنفسك، فيفشل معرِّف منقول عن لقطة شاشة بلا سبب وجيه. وهذه الأداة تحلّها وتخبرك أنها فعلت، وهذا غير حلّها في صمت.
حدود معلنة
الطابع الزمني لا يزيد وثوقًا عن ساعة الجهاز الذي ولّد المعرِّف. فالمعرِّف يقول متى ظنّ ذلك الجهاز أن الوقتَ وقتُه؛ وعلى جهازٍ ساعتُه خاطئة، أو رجع إلى الوراء بسبب ثانية كبيسة أو تصحيح NTP، تكون القيمة خاطئة ولا يسجّل الشكل من ذلك شيئًا. فالترتيب راحةٌ لا سجلّ تدقيق.
والشطر العشوائي ليس توقيعًا. فبإمكان أي أحد أن يولّد معرِّفًا بأي طابع زمني يشاء؛ إذ لا سرّ في هذا الشكل ولا مجموع تحقق، فلا يثبت المعرِّف شيئًا عمّن صنعه ولا متى. عامله معاملة الاسم، لا معاملة الدليل.
وتحويل ULID إلى UUID الذي تعرضه كل الأدوات تحويل مضبوط، لكن الناتج ليس UUID. فهي البتات الـ128 نفسها مكتوبةً بالست عشري، والـUUID يحجز أربعة بتات لرقم نسخته وبتين لنمطه، والشطر العشوائي في ULID لا يعلم بأيٍّ منهما. ونحوُ واحد من كل أربعة وستين يقع مصادفةً على قيم تمرّ بوصفها UUID من النسخة الرابعة، وسائرها سلاسل ست عشرية على هيئة UUID لن يقبلها أي محلّل مطابق. وهذه الصفحة تعرض الست عشري وتقول في أي الحالين أنت.
وأخيرًا، التصاعد خاصٌّ بكل مولّد لا شاملٌ للجميع. فخادمان يولّدان في الجزء نفسه من الألف من الثانية سيتداخلان بحسب ما يقع من شطريهما العشوائيين، ولا شيء ينسّق بينهما. فداخل لسان تبويب واحد أو عملية واحدة أو مجمّع اتصالات واحد يثبت الترتيب، وبين الأجهزة لا يثبت.
لماذا هي مجانية؟
كل شيء يجري في متصفحك: البتات العشوائية من مصدرك المعمّى أنت، والساعة ساعتك، ولا يُرسل أي معرِّف إلى أي جهة — وهذا هنا أهم من المعتاد، لأن معرِّفًا رآه خادمٌ ما لم يعد ملكك تمامًا لتستعمله رمزًا.
لا حساب ولا حدّ ولا علامة مائية، إذ لا كلفة خادم تُستردّ.