كيف يختار Namesome

باختصار: يسحب متصفحك الاسم بمولّد أرقام عشوائية تشفيري، قبل أن تتحرك العجلة. وهنا التفصيل، وكيف تتحقق منه.

من أين تأتي العشوائية

يبدأ كل اختيار بـ crypto.getRandomValues، وهو مولّد الأرقام العشوائية المدمج في متصفحك والمستمد من نظام تشغيلك. وهو المصدر نفسه الذي يحمي الاتصالات، لا الحساب المختصر الذي تكتفي به معظم الحركات. ويُختار الاسم فور ضغطك على «أدِر»، وما الحركة إلا طريقة لعرض قرار اتُّخذ سلفًا، ولهذا لا يغيّره شيء مما تفعله يدك: لا قوة الدفع ولا مدته.

تغيّر الأوزان الفرص عن قصد، ويتغير عرض كل شريحة معها، فيطابق ما يراه الناس ما تفعله القرعة.

استثناء واحد، نقوله صراحة: حين تحمل قرعة الهدايا من قواعد «لا يجوز أن يسحب فلان فلانًا» ما يجعل السحب العشوائي عاجزًا عن إيجاد نتيجة تحققها جميعًا، يلجأ Namesome إلى حل مبني من القواعد نفسها بعد خلطها. تلك النتيجة قرعة صحيحة لا قرعة موزَّعة بالتساوي، وهذا هو الموضع الوحيد في الموقع الذي يفترق فيه المعنيان.

تحقق بنفسك

شغّل خمسين ألف دورة في هذا المتصفح وقارن ما خرج باختبار مربع كاي. العجلات المتساوية تقع ضمن المدى المتوقع، والعجلات الموزونة تقع قرب أوزانها. ولا يُرسل شيء إلى أي مكان — يعمل الاختبار على جهازك.

اختبار التوزيع

لم يُقَس شيء بعد. يجري الاختبار 100,000 اختيار في هذا المتصفح — 50,000 لكل اختبار من الاثنين.

يمنح الاختبار الثاني المدخلات الثلاثة أوزان 1 و2 و3: فالشريحة التي يكبر حجمها ثلاث مرات تخرج ثلاث مرات أكثر، وهذا ما تقيسه أرقامه.

كيف يعمل الاختبار

يأخذ كل اختيار 64 بتًا جديدة من crypto.getRandomValues — المولّد نفسه الذي يستعمله المتصفح للمفاتيح — ويحوّلها إلى عدد في المجال ⁦[0, 1)⁩ ثم يمشي على أوزان المدخلات حتى يقع عندها. ولا شيء من الحركة ولا من التوقيت ولا من الرسم يمس النتيجة: الاسم موجود قبل أن تبدأ العجلة بالدوران.

الاختباران كلاهما اختبار مربع كاي لجودة المطابقة (بيرسون). يجمع المقياس (المرصود − المتوقع)² ÷ المتوقع على المدخلات، فالعدد الصغير يعني أن الأعداد تقع حيث يضعها اختيار متساوٍ. يستعمل الاختبار الأول ثماني مدخلات متساوية الوزن: 7 درجات حرية، والقيمة الحرجة 24.322. ويستعمل الاختبار الثاني أوزان 1 و2 و3، فتكون الحصص السدس والثلث والنصف: درجتا حرية، والقيمة الحرجة 13.816. والقيمتان الحرجتان مأخوذتان عند p = 0.001.

عند تلك العتبة يخفق مولّد سليم تمامًا نحو مرة في كل ألف جولة. إخفاق واحد يعني أعد التشغيل — وإخفاقان متتاليان يعنيان خللًا حقيقيًا.

قرعات يتحقق منها أي شخص

حين يحتاج الناس إلى دليل — من يعرض أولًا، ومن على جدول المناوبة، وأي اسم خرج من الصندوق — يحوّل سجل القرعة الاختيارَ إلى شيء يستطيع غريب أن يعيده. يضم السجل المدخلات والإعدادات والبذرة والبصمات، وزرًا يعيد الحساب كاملًا أمامك.

التزام ثم كشف

قبل أن توجد النتيجة، ننشر بصمة: قيمة SHA-256 للبذرة السرية والمدخلات ومعرّف القرعة. ثم تُشتق النتيجة من تلك البذرة، وتُنشر البذرة معها. ولأن البصمة نُشرت أولًا، ما كان بوسعنا أن نعيد السحب مرة بعد مرة حتى تعجبنا النتيجة — إذ لن تبقى البصمة مطابقة.

الالتزام

46cc3578fe29c825a7134c9ba9b5b43d346147d11f2e5264f806f92b943b8b17

البذرة

49114b046bdfc2b0b62c1366dfc097dbb5d2aba0fe251e2c6c8516c4d44696f4

‏ns-draw-v1 في عشرة أسطر

تُوحَّد المدخلات وتُرتَّب، ثم تُجزَّأ بـ SHA-256. والترتيب خلط فيشر-ييتس يقوده تدفق HMAC-SHA256 مفتاحه البذرة، والأسماء المختارة هي أوائل ذلك الترتيب. المدخلات نفسها تعطي النتيجة نفسها، على أي جهاز، وبأي لغة.

// Excerpt of ns-draw-v1. sha256Hex, unhex and next32 are on the record page.
const entries = [...record.entries].map(s=>s.normalize('NFC')).sort();
const entriesHash = await sha256Hex(te.encode(JSON.stringify(entries)));
const commitment = await sha256Hex(te.encode(
  record.seed + '|' + entriesHash + '|' + record.id));
const key = await crypto.subtle.importKey('raw', unhex(record.seed),
  {name:'HMAC', hash:'SHA-256'}, false, ['sign']);
const arr = [...entries];
for (let i = arr.length-1; i > 0; i--){
  const bound = i+1, lim = Math.floor(0x100000000/bound)*bound;
  let r; do { r = await next32(); } while (r >= lim);
  const j = r % bound; [arr[i],arr[j]] = [arr[j],arr[i]];
}
return { entriesHash, commitment, order: arr, winners: arr.slice(0, record.winners) };

مقتطف — أما الدوال المساعدة التي يستدعيها، والزر الذي يعيد تشغيله كاملًا أمامك، ففي صفحة سجل القرعة.

ما لا نفعله أبدًا

لا نأخذ مالًا مقابل قرعة. لا تذاكر، ولا رسوم مشاركة، ولا جوائز، ولا نسب فوز في أي جزء من Namesome، وتمنع شروط الاستخدام توظيفه في أي نشاط قائم على المال. إنه يختار الأسماء؛ وهذه هي المهمة كلها.

محايد تجاه الدفع بالتصميم — ليس فيه ما يمكن ربطه بالمال.

للوكلاء والبرامج

تعيد واجهة API وخادم MCP السجلات نفسها بالبصمات نفسها، فيستطيع مساعد أن يتحقق من قرعة مساعد آخر. ويحمل كل رد رابطًا لصفحة يقرأها إنسان.

اقرأ دليل واجهة API