لديك حساب بالفعل؟ دخول
دخول  سجل الأن 
دالة توليد رقم عشوائي لاستخدامه في الكوكيز
السلام عليكم
أنا أستخدم عدة طرق لتوليد رقم عشوائي
هذا الرقم العشوائي أستخدمه في الكوكيز
لكن رغم أن الرقم عشوائي و معقد فإن هناك إمكانية ولو قليلة جداً
في وجود هذا الرقم العشوائي لعضو آخر في قاعدة البيانات, خصوصاً إذا أصبح الموقع كبير

لهذا أحتاج دالة تقوم بتوليد رقم عشوائي مع التأكد هل موجود في قاعدة البيانات ام لا
إذا كان غير موجود تعطينا الرقم العشوائي
إذا كان موجود تقوم بتوليد رقم عشوائي آخر و تقوم بالتأكد هل موجود أم لا و هكذا
تاريخ البداية: 8 / يناير / 2012 الساعة 14:8 اخر نشاط: 9 / يناير / 2012 الساعة 0:49 عشوائي
4 إجابات
السلام عليكم ,
هناك فكره بسيطه , يمكنك اضافه رقم الاى دى ID الخاص بكل عضو و تشفيره و اضافته إلى الهاش المستخدم .
على سبيل المثال :
md5(123456-ID) ;

بواسطة: Ahsaleh
منذ: 8 / يناير / 2012 الساعة 23:42

هذه فكرة جميلة جدا ايضا ، ويمكننا استعمال md5(uniqid("100_ID", true)); حتى لا يمكن لاحد تخمينه وهكذا لم يتكرر واحد من مليون من الثانية
8 / يناير / 2012 الساعة 23:47

هذه طريقة اخرة جيدة
9 / يناير / 2012 الساعة 0:34

نعم تقريباً نفس الذي استعمله انا استعملت دالة microtime و strval و sha1 مع اسم العضو لأنه إسم العضو لا يتكرر زي الايدي و بهذه الطريقة لن يتكرر أبداً
9 / يناير / 2012 الساعة 0:49

ما يريده هو عمل رقم عشوائى لا يمكن ان يتكرر ، طلبك يحل بطريقة نموذجية لو اعتمدت على الوقت ، فالوقت لا يتكرر مرتين الا اذا استعملت الة زمن ، ودالة uniqid تعتمد على الوقت فى توليد رقم عشوائى ولكن لنجعلها اكثر فاعلية من الممكن استخدامها كالتالى
md5(uniqid(mt_rand(), true));

بواسطة: Dina
منذ: 8 / يناير / 2012 الساعة 14:18

نعم بالفعل هذه هي الفكرة بس على الدالة أن تقوم بالاستعلام من قاعدة البيانات هل الرقم موجود و يعدها تنفذ الأمر
8 / يناير / 2012 الساعة 14:23

ولماذا تستعلم؟ من رابع المستحيلات ولو حتى عندك 19 بليون مدخل ان الرقم بتكرر ، لان الوقت مش بيتكرر
8 / يناير / 2012 الساعة 15:27

الوقت يمكن أن يتكرر مثلا الرابعة مساء اليوم و الرابعة مساء الغذ, أو يمكن أنه بسبب كثرة الزوار يدخل عضوين في نفس الوقت و هناك احتمال ولو OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO,1 في المئة أن يتم توليد نفس الرقم فلمنع هذا من الوقوع الأفضل نعمل الاستعمال حتى نزيل أي شك
8 / يناير / 2012 الساعة 22:11

المايكرو ثانية لا تتكرر مرتين والتاريخ لا يتكرر لان الرابعة مساء اليوم غير الرابعة مساء الغد انت تنسى ان اليوم والشهر والسنة مع الوقت
8 / يناير / 2012 الساعة 22:49

حتى لو كان هذا خذ في الحسبان دخول عدد كبير من الاعداد في وقت واحد هناك احتمال ولو 1 في البليون ان الرقم ممكن يتكرر
8 / يناير / 2012 الساعة 22:53

ورحمة ابوى ما راح يتكرر هههههههه :) ولا تنسى ايضا انك تضيف رقم عشوائى mt_rand مع الميكرو ثانية ، ولو عايز تفحصه من وجوده ام لا .. الاستعلام بسيط للغاية ولكن ليس له داعى
8 / يناير / 2012 الساعة 22:56

ههههههههههه اعمل ايه في دماغي دماغ انشتاين مش عاوز يقتنع
8 / يناير / 2012 الساعة 23:3

هذه الدالة الرائعة تعطيك متغير عشوائى ويمكنك استرجاعه مرة اخرى
function rand_uniqid($in, $to_num = false, $pad_up = false, $passKey = null)
{
    $index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if ($passKey !== null) {
        // Although this function's purpose is to just make the
        // ID short - and not so much secure,
        // you can optionally supply a password to make it harder
        // to calculate the corresponding numeric ID

        for ($n = 0; $n<strlen($index); $n++) {
            $i[] = substr( $index,$n ,1);
        }

        $passhash = hash('sha256',$passKey);
        $passhash = (strlen($passhash) < strlen($index))
            ? hash('sha512',$passKey)
            : $passhash;

        for ($n=0; $n < strlen($index); $n++) {
            $p[] =  substr($passhash, $n ,1);
        }

        array_multisort($p,  SORT_DESC, $i);
        $index = implode($i);
    }

    $base  = strlen($index);

    if ($to_num) {
        // Digital number  <<--  alphabet letter code
        $in  = strrev($in);
        $out = 0;
        $len = strlen($in) - 1;
        for ($t = 0; $t <= $len; $t++) {
            $bcpow = bcpow($base, $len - $t);
            $out   = $out + strpos($index, substr($in, $t, 1)) * $bcpow;
        }

        if (is_numeric($pad_up)) {
            $pad_up--;
            if ($pad_up > 0) {
                $out -= pow($base, $pad_up);
            }
        }
        $out = sprintf('%F', $out);
        $out = substr($out, 0, strpos($out, '.'));
    } else {
        // Digital number  -->>  alphabet letter code
        if (is_numeric($pad_up)) {
            $pad_up--;
            if ($pad_up > 0) {
                $in += pow($base, $pad_up);
            }
        }

        $out = "";
        for ($t = floor(log($in, $base)); $t >= 0; $t--) {
            $bcp = bcpow($base, $t);
            $a   = floor($in / $bcp) % $base;
            $out = $out . substr($index, $a, 1);
            $in  = $in - ($a * $bcp);
        }
        $out = strrev($out); // reverse
    }

    return $out;
}
مثال
rand_uniqid(9007199254740989);
سوف تعطيك 'PpQXn7COf'
rand_uniqid('PpQXn7COf', true);
سوف تعطيك '9007199254740989'

بواسطة: علاء
منذ: 8 / يناير / 2012 الساعة 14:15

بواسطة: MacOS
منذ: 8 / يناير / 2012 الساعة 14:12

أنشر اجابتك

xهل تريد الاجابة عن هذا السؤال؟ من فضلك سجل دخول او اشترك لتتمكن من الاجابة