وحید رضازاده
4 سال پیش توسط وحید رضازاده مطرح شد
14 پاسخ

ایجاد یک رشته Uniq

سلام
در php میخوایم یک رشته نهایت ۵ تا ۶ کاراکتری یکتا ایجاد کنیم
برای مثلا کد معرف و اینجور مسایل که از اعداد و حروف انگلیسی تشکیل شده باشه
کسی تابعی که ۱۰۰ درصد قابل اطمینان باشه میشناسه ؟
منظورم اینه که تکراری تولید نکنه.


ثبت پرسش جدید
محمد مهدی
@MohammadMahdi 4 سال پیش مطرح شد
1

@vahidrezazadeh
سلام،

$rand = substr(md5(microtime()),rand(0,26),5);

حالا واسه این تکراری نباشه اگه جایی اینا رو ذخیره میکنید با استفاده از یه do-while چک کنید اگه همچین چیزی بود دوباره یکی دیگه بسازه!
حالا من این کد رو هم دیدم که خوب به نظر میومد شما هم یه چکی بکنید از این لینک:

<?php

$seed = str_split('abcdefghijklmnopqrstuvwxyz'
                     .'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                     .'0123456789!@#$%^&*()'); // and any other characters
    shuffle($seed); // probably optional since array_is randomized; this may be redundant
    $rand = '';
    foreach (array_rand($seed, 5) as $k) $rand .= $seed[$k];

    echo $rand;

وحید رضازاده
تخصص : برنامه نویس
@vahidrezazadeh 4 سال پیش مطرح شد
0

@MohammadMahdi
ممنون
توی حجم بالا نمیشه چک کرد به راحتی


احسان قربانی
تخصص : PHP ، در حال یادگیری لاراول ،...
@TimeRunner2359 4 سال پیش مطرح شد
0

@vahidrezazadeh
سلام و وقت بخیر
من الان یه سرچی زدم ، این لینک رو ببینید
پایین‌تر توی همون صفحه نوشته که برای طول رشته 10 یا بزرگتر تقریبا شانس تکراری بودن هیچه
همچنین یه جای دیگه همین حرف رو برای uniqid() گفته بودن :

in most cases, they will be different. Chances of hash collisions are very, very low (think one in billions).

و برای افزایش آنتروپی جواب‌ها هم این پیشنهاد رو داده بودن :

For increased entropy, you can call the function like this: uniqid('',TRUE);

البته تجربه دوستان بیشتره ولی به نظرم اگر طول به اندازه کافی زیاد باشه احتمالش واقعا کمه که تکراری بشه
موفق و سلامت باشید
یا حق


وحید رضازاده
تخصص : برنامه نویس
@vahidrezazadeh 4 سال پیش مطرح شد
0

@TimeRunner2359
uniqid خیلی رشته طولانی تولید میکننه که مناسب نیست.


احسان قربانی
تخصص : PHP ، در حال یادگیری لاراول ،...
@TimeRunner2359 4 سال پیش مطرح شد
0

@vahidrezazadeh
ببیینید اگه واقعا در اون حد تعداد و حجمتون زیاده که ۷۲ به توان ۵ یا ۶ حالت پاسخگو نباشه مجبور میشید که طول رشته رو افزایش بدید
به نظر من کاری که آقای @MohammadMahdi هم کردند جالبه


وحید رضازاده
تخصص : برنامه نویس
@vahidrezazadeh 4 سال پیش آپدیت شد
0

@TimeRunner2359
بحث تعداد و حجم نیست ، بحث سرعت هست که نمیشه حلقه گذاشت
الان تپ30 کد معرف هاش 6 حرفی هست (برای من البته)


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 4 سال پیش مطرح شد
1

@vahidrezazadeh

احتمالا بیشتر از بنده مستحضر هستید که یک دستوری داریم برای صرفا چک کردن اینکه یک رکورد وجود داره یا نه (exist). و این دستور از نظر سرعت و بهره وری تفاوت خیلی زیادی داره با select کردن یا همون get کردن تک تک رکوردها. منظور اینکه به نظرم اگر با index گذاری صحیح و کوئری بهینه فرایند چک کردن وجود یا عدم وجود با حلقه while چک بشه نباید حتی در حجم بالای رکورد هم مشکل خاصی ایجاد کنه.


وحید رضازاده
تخصص : برنامه نویس
@vahidrezazadeh 4 سال پیش مطرح شد
0

@mhyeganeh
در این مورد نمیشه ازش استفاده کرد.


احسان قربانی
تخصص : PHP ، در حال یادگیری لاراول ،...
@TimeRunner2359 4 سال پیش آپدیت شد
1

@vahidrezazadeh
تا جایی که عقل من قد میده ( :) ) راه‌حلی جز این نیست چون بشر هنوز نتونسته راه‌حل قطعی برای اینکه یک رشته یا عدد کاملا رندوم و غیر تکراری بسازه ارائه بده(منظورم اینه بالاخره احتمالش هست که باز هم تکراری در بیاد حتی با طول رشته بزرگ) . تنها راه‌حل باید همین چک کردن با حلقه باشه که باید گشت و الگوریتم بهینه رو برای حجم بالا پیدا کرد .
البته که تجربه‌ی دوستان بیشتره


نیما - ش
تخصص : برنامه نویس وب
@nimageneral 4 سال پیش مطرح شد
0

وحید جان شما باید خروجی حاصل از متد رشته یونیک رو جایی ذخیره کنید در هر صورت برای کنترل رشته های یونیک بعدی، برای عدم کاهش سرعت میتونید همه رو بصورت یک آرایه و در یک فیلد در دیتابیس ذخیره کنید . به این صورت که این آرایه را در دیتایبس ذخیره بشه و برای هر بررسی فقط یک درخواست ارسال بشه تا این آرایه را بگیرید و سپس بررسی با مقادیر آرایه نه اینکه واسه هر رشته ، ما چندین درخواست را بفرستیم.


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 4 سال پیش مطرح شد
0

@vahidrezazadeh

حقیقتش کنجکاو شدم بدونم چرا نمیشه و مشکل دقیقا چیه؟ (بیشتر جهت کسب تجربه و نه فضولی 😉)


وحید رضازاده
تخصص : برنامه نویس
@vahidrezazadeh 4 سال پیش مطرح شد
0

@mhyeganeh
این کد چندجا استفاده میشه ، توی جداول مختلف با فشار بالا ، یعنی تا بیایم چک کنیم که آیا ثبت شده یا نه امکان داره یکی دیگه ثبت شه.


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 4 سال پیش آپدیت شد
0

@vahidrezazadeh

نظرتون راجع به استفاده از تابع mircotime() در php چیه؟ (timestamp فعلی رو با دقت میکروثانیه میده). مثلا اینجوری:

round(microtime(true) * 10000)

به نظرتون چند درصد احتمال داره دو تا از عملیات هاتون در فاصله کمتر از یک میکروثانیه اتفاق بیافته؟ نهایتا میتونید یک یا چند کاراکتر حرفی رندوم هم خودتون بهش اضافه کنید جهت محکم کاری.


وحید رضازاده
تخصص : برنامه نویس
@vahidrezazadeh 4 سال پیش مطرح شد
0

یک عدد خیلی بزرگ داد :‌15946334153393
این مقدار بزرگ به کار نمیاد


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام