ساختن یک عدد 10 رقمی غیر تکراری

JS-mahdi

Banned
سلام دوستان من دارم یه برنامه مینویسم که که در اون نیاز دارم یه عدد 10 رقمی رو به صورت تصادفی تولید کنم و در دیتا بیس ذخیره کنم ! من نمیخام این عدد هیچ وقت تکرار بشه و همیشه یک عدد جدید بسازه ! ممنون میشم اگه تابعی که این کار رو میکنه به من معرفی کنید .. با تشکر .
 

peyman1987

Member
دوست عزیز برای چی این عدد رو میخوای؟

اگر واجبه میتونی از کد زیر استفاده کنی. این timestamp رو بهت میده که از قضا 10 رقمیه و هیچوقت هم تکرار نمیشه چون زمان رو نشون میده و فقط زمانی میتونه تکرار بشه که زمان به عقب برگرده.
کد:
time();
 

JS-mahdi

Banned
پیداش کردم

$possible = '23456789bcdfghjkmnpqrstvwxyz';
$code = '';
$i = 0;
while ($i < 10) {
$code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
$i++;
}


فقط یکی بگه میتونم مطمئن باشم که Code$ هیچ وقت تکراری نیست !
این رو از تو یه اسکریپت ساختن تصویر امنیتی استخراج کردم درست هم کار میکنه
 

amirds

New Member
سلام
دوست گرامی برای قرار دادن کد لطفا از تگ های php استفاده نمایید .

اما سوال شما :
بهترین تابعی که تا حالا باهاش کارکردم اینه
PHP:
function create_password($length=8,$use_upper=1,$use_lower=0,$use_number=1,$use_custom="")
{
    $upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $lower = "abcdefghijklmnopqrstuvwxyz";
    $number = "0123456789";
    if($use_upper){
        $seed_length += 26;
        $seed .= $upper;
    }
    if($use_lower){
        $seed_length += 26;
        $seed .= $lower;
    }
    if($use_number){
      $seed_length += 10;
        $seed .= $number;
    }
    if($use_custom){
        $seed_length +=strlen($use_custom);
        $seed .= $use_custom;
    }
    for($x=1;$x<=$length;$x++){
        $password .= $seed{rand(0,$seed_length-1)};
    }
    return($password);
}
تعداد تکراری هاش خیلی خیلی کمه :)(البته به تعداد ارقام و محدودت هایی که براش قرار میدی هم بستگی داره ) اما استفاده از کلمه ""هیچ وقت"" در این نوع توابع درست نیست. بهترین راه همونی هست که peyman1987 فرمودن .

البته اگر مورد استفاده رو هم بگی شاید بشه پیشنهادات بهتری کرد .
موفق باشید
 

JS-mahdi

Banned
چیزی که پیمان گفت نمیشه چون من یه عدد قیر قابل حدث میخام اون شکلی میشه کاربر دیگه اون کد رو حدث بزنه
 

sajadmaz

Member
میتونی از کد زیر استفاده کنی

PHP:
<?PHP
  for($i=1; $i <= 100000; $i++)
    {
    	$id_r = rand(1000000000,9999999999);

        $id = mysql_query("SELECT `id` FROM `tablename` WHERE `id`='$id_r'");
                              if (!mysql_num_rows($id) == 1 )
                              {

                              
                                 Return $id_r;

                                 break;

                               }

       }
?>

فک کنم واضح باشه نیاز به توضیح نداره دیگه
مشکلی بود در خدمتم
 
آخرین ویرایش:

I.NoBody

Active Member
امکان استفاده از auto_increament رو نداری؟
اینجوری که خیلی راحتتره
 

I.NoBody

Active Member
تعداد اعداد 10 رقمی کاملاً مشخصه.
شما می تونی فیلد اوتو اینکریمنتتو از عدد 1000000001 شروع کنی.
خودبخود بعدی هاش 10 رقمی میشن دیگه
 

peyman1987

Member
پیداش کردم





فقط یکی بگه میتونم مطمئن باشم که Code$ هیچ وقت تکراری نیست !
این رو از تو یه اسکریپت ساختن تصویر امنیتی استخراج کردم درست هم کار میکنه

دوست عزیز شما گفتی عدد 10 رقمی غیر تکراری. نگفتی کاراکتر میتونه داخلش باشه اینجوری خوب نمیشه با این راه بدست آوردش.


چیزی که پیمان گفت نمیشه چون من یه عدد قیر قابل حدث میخام اون شکلی میشه کاربر دیگه اون کد رو حدث بزنه

در ضمن اول کاربرد رو بگین بعد کد بخواین. اگه برای ID از این عدد میخواین استفاده کنین چه اهمیتی داره که کاربر بتونه بفهمه یا نه؟؟؟




در کل بهترین راه حل به نظر من یا همین auto increment از 1000000000 هست یا همون time stamp بقیه کارها دوباره کاریه چون آخرش به همین نتیجه ای میرسی که الان دوستان دیگه رسیدن.
 

the_king

مدیرکل انجمن
چون با زبان PHP آشنایی ندارم به ناچار فقط به الگوریتم راه حل اشاره می کنم.

شما بایستی timestamp را به کاراکتر تبدیل کنید و بپیچونید تا به سادگی شناسایی نشه.

ابتدا timestamp را با تابع ()time دریافت کنید و در یک متغیر مثل t$ قرار دهید.

اکنون یک رشته 10 کاراکتری دارید که کاراکتر های آن بین "0" الی "9" هستند.
مثلا :
"1138618081"

اکنون مقدار 17 را به کد هر کاراکتر آن اضافه کنید تا به فرم "A" الی "J" تبدیل شوند.
(فاصله کد کاراکتر "0" تا کد کاراکتر "A" برابر با 17 است).
مثلا :
"BBDIGBIAIB"

حالا بایستی کد کاراکتر ها را با یکسری اعداد ثابت بین 1 الی 7، XOR کنید تا بصورت کلی تغییر کنند.
مهم این است که این 10 عدد همواره ثابت باشند.
مثلا با این سری اعداد XOR می کنیم (هر کاراکتر را با عدد روبرویش):
7-6-3-1-5-3-6-4-2-7

حاصل چنین خواهد بود :
"EDGHBAOEKE"

اکنون کافیست که جای کاراکتر ها را عوض کنید، مثلا ترتیب قرار گیری کاراکتر ها را از این
1-2-3-4-5-6-7-8-9-10
به این تغییر دهید :
3-6-1-8-2-7-4-10-5-9

حاصل چنین خواهد بود :
"GAEEDOHEBK"

این کد برای ثانیه های متوالی هرگز تکرار نخواهد شد (در هر ثانیه یک کد منحصر بفرد است)
ببخشید، من PHP بلد نیستم وگرنه کد روتین را ارائه می کردم.
 

firebird

Member
شما سی یا پاسکالشو بذار من PHP شو مینویسم. البته همون طور که گفتم PHP تابعی داره به اسم uniqid که برای هر میلی ثانیه یک عدد تولید میکنه. برنامه نویس ها خروجی این تابع رو با روش های مختلف به اون چیزی که میخوان تبدیل میکنند مثلاً:
PHP:
list($hex, $dec) = explode(’.', uniqid(null, true));
$id = (base_convert($hex, 16, 36) . base_convert($dec, 10, 36));
البته با چیزی که دوستمون میخواد تا حدی متفاوت هست ولی همیشه یکتاست.
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا