راکت

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

14 پاسخ

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

ثبت پرسش جدید

پاسخ‌ها

14
محمد مهدی
محمد مهدی
@MohammadMahdi

@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

تخصص: برنامه نویس

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

شاید پاسخ شما همین‌جا باشد

احسان قربانی
احسان قربانی
@TimeRunner2359

تخصص: PHP ، در حال یادگیری لاراول ، MidLevel درفرانت اند

@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

تخصص: برنامه نویس

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

احسان قربانی
احسان قربانی
@TimeRunner2359

تخصص: PHP ، در حال یادگیری لاراول ، MidLevel درفرانت اند

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

وحید رضازاده
وحید رضازاده
@vahidrezazadeh

تخصص: برنامه نویس

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

محمدحسن یگانه
محمدحسن یگانه
@mhyeganeh

تخصص: Full-Stack Web Developer Freelancer

@vahidrezazadeh

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

وحید رضازاده
وحید رضازاده
@vahidrezazadeh

تخصص: برنامه نویس

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

احسان قربانی
احسان قربانی
@TimeRunner2359

تخصص: PHP ، در حال یادگیری لاراول ، MidLevel درفرانت اند

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

نیما  ش
نیما ش
@nimageneral

تخصص: برنامه نویس وب

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

محمدحسن یگانه
محمدحسن یگانه
@mhyeganeh

تخصص: Full-Stack Web Developer Freelancer

@vahidrezazadeh

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

وحید رضازاده
وحید رضازاده
@vahidrezazadeh

تخصص: برنامه نویس

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

محمدحسن یگانه
محمدحسن یگانه
@mhyeganeh

تخصص: Full-Stack Web Developer Freelancer

@vahidrezazadeh

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

round(microtime(true) * 10000)

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

وحید رضازاده
وحید رضازاده
@vahidrezazadeh

تخصص: برنامه نویس

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

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

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