سؤال الرياضيات بخصوص Python's Uuid4
-
29-09-2019 - |
سؤال
أنا لست رائعًا مع الرياضيات الإحصائية ، وما إلى ذلك. لقد كنت أتساءل ، إذا استخدمت ما يلي:
import uuid
unique_str = str(uuid.uuid4())
double_str = ''.join([str(uuid.uuid4()), str(uuid.uuid4())])
هو double_str
سلسلة مربعة فريدة من نوعها unique_str
أو مجرد مبلغ أكثر فريدة من نوعه؟ أيضا ، هل هناك أي آثار سلبية في القيام بشيء مثل هذا (مثل بعض موقف مشكلة عيد الميلاد ، إلخ)؟ قد يبدو هذا جاهلاً ، لكنني ببساطة لن أعرف لأن الرياضيات الخاصة بي تمتد الجبر 2 في أحسن الأحوال.
المحلول
ال uuid4
تقوم الوظيفة بإرجاع uuid تم إنشاؤها من 16 بايت عشوائي وهي موجودة الى ابعد حد من غير المرجح أن تنتج تصادمًا ، لدرجة أنك ربما لا ينبغي أن تقلق بشأنه.
إذا لسبب ما uuid4
يفعل إنتاج نسخة مكررة ، من المرجح أن يكون خطأ في البرمجة مثل الفشل في تهيئة مولد الأرقام العشوائية بشكل صحيح من الحظ السيئ الأصلي. في هذه الحالة ، سوف النهج الذي تستخدمه ليس اجعله أفضل - لا يزال بإمكان مولد الأرقام العشوائية المهيئة بشكل غير صحيح إنتاج التكرارات حتى مع نهجك.
إذا كنت تستخدم التنفيذ الافتراضي random.seed(None)
يمكنك أن ترى في مصدر يتم استخدام 16 بايت فقط من العشوائية لتهيئة مولد الأرقام العشوائية ، لذلك هذه مشكلة يجب عليك حلها أولاً. أيضًا ، إذا كان نظام التشغيل لا يوفر مصدرًا للعشوائية ، فسيتم استخدام وقت النظام وهو ليس عشوائيًا على الإطلاق.
لكن تجاهل هذه القضايا العملية ، فأنت في الأساس على طول الخطوط الصحيحة. لاستخدام نهج رياضي ، علينا أولاً تحديد ما تعنيه بـ "التفرد". أعتقد أن التعريف المعقول هو عدد المعرفات التي تحتاج إلى توليدها قبل أن يتجاوز احتمال توليد مكررة بعض الاحتمالات p
. صيغة متناثرة لهذا هو:
أين d
هو 2**(16*8)
للحصول على uuid تم إنشاؤه عشوائيا و 2**(16*2*8)
مع نهجك المقترح. الجذر التربيعي في الصيغة يرجع بالفعل إلى مفارقة عيد ميلاد. ولكن إذا قمت بعملها ، فيمكنك رؤية ذلك إذا قمت بتوسيع نطاق القيم d
مع الحفاظ p
ثابت ثم يمكنك أيضا مربع n
.
نصائح أخرى
نظرًا لأن UUID4 يستند إلى مولد رقم عشوائي زائفة ، فإن وصفه مرتين لن يربط كمية "التفرد" (وقد لا تضيف أي تفرد على الإطلاق).
أنظر أيضا متى يجب أن أستخدم uuid.uuid1 () مقابل uuid.uuid4 () في بيثون؟
يعتمد ذلك على مولد الأرقام العشوائية ، لكنه تفرد تقريبًا.