سؤال

أنا أفكر في استخدام هذا: http://phpgoogle.blogspot.com/2007/08/four-ways-to-generate-unique-id-by-php.html

فكرتي هي استخدام خليط بين 2 و 3. ولكن سؤالي هو أنه ، على الرغم من أن الفرص صغيرة ، لا تزال هناك فرصة لتكوين طلبين بنفس الترتيب # إذا قمت بتشغيل النتيجة لتكون 5 أحرف فقط طويل؟ ماذا عن 3؟ 2؟ 1؟ بالتأكيد إذا كان 1 ، هناك فرصة 1/(26 + 10) لأن يكون المعرف هو نفسه؟

هل كانت مفيدة؟

المحلول

على افتراض مصادقة المستخدمين لديك ولديهم معرف مستخدم:

$unique_id = time() . mt_rand() . $userid;

إذا طلب المستخدم نفسه هذه الصفحة مرة ثانية في نفس الثانية ، فستظل هناك فرصة 1 في mt_getrandmax(), ، أيها على جهازي إرجاع 2147483647. ربما يمكنك التعايش مع ذلك؟

إذا لم يتم مصادقة المستخدمين ، فيمكنك استخدام علامة تجزئة عنوان IP الخاص بهم بدلاً من ذلك إذا كنت ترغب في ذلك.

نصائح أخرى

لماذا تحتاج إلى معرف فريد؟

إذا كنت ترغب في إنشاء معرف فريد من نوعه في DB الخاص بك ، فاتركه إلى ديسيبل ، باستخدام التلقائي التلقائي.

على أي حال ، يمكنك استخدام مجموعة من microtime () و rand (). أنت فريد جدا.

تحرير ، بالنسبة لتعليق OP:

لا يمكنك الحصول على "فريد دائمًا" إذا. أو إذا وجدت كيف ستفوز بجائزة تورينج.

حتى أن الموافقة الرياضية الأفضل تتركك مع طعم "نعم ولكن مرة واحدة في 15645736536475 مرة ، سأشعر".

الطريقة الوحيدة هي أن تكون مضادًا ، وأنك تزيد في كل مرة تحتاج فيها إلى معرف جديد. هكذا يفعل DBS. لماذا تحتاج إلى الهوية قبل الإدراج؟

إذا كنت تعتمد على سلسلة عشوائية ، نعم ، من الممكن نظريًا أن يكون هدفين متماثلان. لهذا السبب يتم استخدام سلسلة عشوائية طويلة ، لجعل هذا الاحتمال غير محتمل بحيث تكون مقبولة. يمكن حساب الاحتمالات: على سبيل المثال إذا كان معرف يتكون من الوقت الحالي (إلى أقرب ثانية) وسلسلة أبجدية رقمية من 5 أحرف ، وافتراض أن 3 معرفات يتم إنشاؤها في نفس الثانية ، ثم احتمالات اثنين ( أو أكثر) كونه متماثلًا هو: 1-(38^5! / (38^5-3)! / 38^5^3) = 3.79E-8. يتفق معظم الناس على أن مثل هذه الصعاب ليس منخفض بما يكفي للتطبيقات العملية ، وهذا هو السبب في أن الصفحة التي ربطتها تقترح 10 أحرف بدلاً من ذلك.

إذا كان لديك معرف جلسة ، اسم مستخدم ، وما إلى ذلك ، فيمكنك استخدام ذلك في معرف الطلب ، للمساعدة في الأمور.

مأخوذة من PHP's UniqidManpage:

$better_token = md5(uniqid(mt_rand(), true));

على الرغم من أنه قد يكون من الأفضل مغادرة md5-جزء خارج (يقلل من عدد الرموز إلى 2^128)

إذا كنت تستخدم قاعدة بيانات ، فعندك نعم ، يجب أن تدع DBMs تتعامل مع توليد المعرف

يمكنك استخدام Microtime و SHA256 Hashing ، أو بدون التجزئة.

 $generate_order_id  = hash('sha256', microtime() );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top