سلام
در php میخوایم یک رشته نهایت ۵ تا ۶ کاراکتری یکتا ایجاد کنیم
برای مثلا کد معرف و اینجور مسایل که از اعداد و حروف انگلیسی تشکیل شده باشه
کسی تابعی که ۱۰۰ درصد قابل اطمینان باشه میشناسه ؟
منظورم اینه که تکراری تولید نکنه.
@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
سلام و وقت بخیر
من الان یه سرچی زدم ، این لینک رو ببینید
پایینتر توی همون صفحه نوشته که برای طول رشته 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
ببیینید اگه واقعا در اون حد تعداد و حجمتون زیاده که ۷۲ به توان ۵ یا ۶ حالت پاسخگو نباشه مجبور میشید که طول رشته رو افزایش بدید
به نظر من کاری که آقای @MohammadMahdi هم کردند جالبه
@TimeRunner2359
بحث تعداد و حجم نیست ، بحث سرعت هست که نمیشه حلقه گذاشت
الان تپ30 کد معرف هاش 6 حرفی هست (برای من البته)
احتمالا بیشتر از بنده مستحضر هستید که یک دستوری داریم برای صرفا چک کردن اینکه یک رکورد وجود داره یا نه (exist). و این دستور از نظر سرعت و بهره وری تفاوت خیلی زیادی داره با select کردن یا همون get کردن تک تک رکوردها. منظور اینکه به نظرم اگر با index گذاری صحیح و کوئری بهینه فرایند چک کردن وجود یا عدم وجود با حلقه while چک بشه نباید حتی در حجم بالای رکورد هم مشکل خاصی ایجاد کنه.
@vahidrezazadeh
تا جایی که عقل من قد میده ( :) ) راهحلی جز این نیست چون بشر هنوز نتونسته راهحل قطعی برای اینکه یک رشته یا عدد کاملا رندوم و غیر تکراری بسازه ارائه بده(منظورم اینه بالاخره احتمالش هست که باز هم تکراری در بیاد حتی با طول رشته بزرگ) . تنها راهحل باید همین چک کردن با حلقه باشه که باید گشت و الگوریتم بهینه رو برای حجم بالا پیدا کرد .
البته که تجربهی دوستان بیشتره
وحید جان شما باید خروجی حاصل از متد رشته یونیک رو جایی ذخیره کنید در هر صورت برای کنترل رشته های یونیک بعدی، برای عدم کاهش سرعت میتونید همه رو بصورت یک آرایه و در یک فیلد در دیتابیس ذخیره کنید . به این صورت که این آرایه را در دیتایبس ذخیره بشه و برای هر بررسی فقط یک درخواست ارسال بشه تا این آرایه را بگیرید و سپس بررسی با مقادیر آرایه نه اینکه واسه هر رشته ، ما چندین درخواست را بفرستیم.
حقیقتش کنجکاو شدم بدونم چرا نمیشه و مشکل دقیقا چیه؟ (بیشتر جهت کسب تجربه و نه فضولی 😉)
@mhyeganeh
این کد چندجا استفاده میشه ، توی جداول مختلف با فشار بالا ، یعنی تا بیایم چک کنیم که آیا ثبت شده یا نه امکان داره یکی دیگه ثبت شه.
نظرتون راجع به استفاده از تابع mircotime() در php چیه؟ (timestamp فعلی رو با دقت میکروثانیه میده). مثلا اینجوری:
round(microtime(true) * 10000)
به نظرتون چند درصد احتمال داره دو تا از عملیات هاتون در فاصله کمتر از یک میکروثانیه اتفاق بیافته؟ نهایتا میتونید یک یا چند کاراکتر حرفی رندوم هم خودتون بهش اضافه کنید جهت محکم کاری.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟