Pereiti prie turinio

Kuriant folderi unikalus vardas


Rekomenduojami pranešimai

Sveiki, taigi biski susimasciau kaip cai geriau padaryti.

 

Pradesiu nuo problemos.

 

Turiu skripta kuris kelia foto i tam tikra kataloga. Kiekviena karta kai vartotoajs ikelia foto reikia kad katalogo vardas butu unikalus, geriausia is skaiciu.

 

Ir dabar galvoju ar eina taip padaryti kad php kiekviena karta duotu kokia tai unikalia skaiciau reiksme. Maciau yra tam funkcijos, bet nesuprantu kaip jos patikrins ar jau nera sukurtas folderis su tokiu vardu.

 

Ar daryti taip kad pasiimt ivisu folderiu sarasa sukti cikla ir tikrinti ar tas random numeris yra unikalus, jeigu unikalus tada kurti nauja fodleri o jeigu ne tada sukti cikla darkarta.

 

tikiuosi supratote problema dekui

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Paprasciausias budas - generuok nauja aplanko varda, kol surasi neegzistuojanti (nereikia nuskaityti visu aplanku vardu, galima tiesiog tikrinti ar egzistuoja tas specifinis aplankas). Siuo budu, yra galimybe, kad keli zmones gaus bendra aplanka, taciau sansas, kad taip ivyks, yra labai mazas ir nelabai reiktu kreipti demesi (nebent pas tave lankosi milojonai vartotoju).

 

Jei visgi nori sumazinti ta sansa: kurk aplanko varda is 2 daliu. 1 dalis tegul buna laikas, kada yra kuriamas aplankas (taipogi nauda statistikai), o antra dalis yra random generuojama.

 

Jei nori visiskai panaikinti ta sansa, teks naudoti kazka kas palaiko multi-threading (kaip DB), taciau tas kurs nereikalinga overhead.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

http://php.net/manua...tion.uniqid.php

 

Tai kaip surpatau sita funkcija ir generuoja unikalu id nes pasitelkia dabartine data

 

Ji generuoja 'unikalu' id pagal esama laika. Taciau, ji negarantuoja, kad 2 sugeneruoti id nebus vienodi (nors tai greiciausiai ivyks nebent jei yra vykdomas DDoS


$a; $b;
$a = uniqid();
$b = uniqid();
echo $a;
echo "<br>";
echo $b;

----
54ae6651d08c3
54ae6651d08c3

Redagavo Imago
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ji generuoja 'unikalu' id pagal esama laika. Taciau, ji negarantuoja, kad 2 sugeneruoti id nebus vienodi (nors tai greiciausiai ivyks nebent jei yra vykdomas DDoS


$a; $b;
$a = uniqid();
$b = uniqid();
echo $a;
echo "<br>";
echo $b;

----
54ae6651d08c3
54ae6651d08c3

Supratau, dekui.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Timestamp turi daugiausiai sansu, kad nesidublikuos, o jei atsitiks taip, kad kuria folderi ta pacia sekunde, tai uniqid sumazins ta dublikavimosi sansa

uniqid() . DateTime::getTimestamp()

IS idomumo, ar skaitei, ka raso uniqid() dokumentacija? uniqid susideda is: pirmi 8 zenklai - Unixtime, 5 paskutiniai - mikrosekundziu hex. Kur Unixtime = DateTime::getTimestamp(), tad getTimestamp() yra kurkas maziau tikslus nei uniqid.

 

Pagal dokumentacija, jei reikia dar didesniu garantiju, kad bus unikalus vardas:


$a; $b;
$a = uniqid(NULL, TRUE);
$b = uniqid(NULL, TRUE);
echo $a;
echo "<br>";
echo $b;
--------
54afd4693be418.12512978
54afd4693be410.45279748

Tik atsargiai su tuo tasku, kad problemu nesudarytu

 

 

Nuoroda į pranešimą
Dalintis kituose puslapiuose

IS idomumo, ar skaitei, ka raso uniqid() dokumentacija? uniqid susideda is: pirmi 8 zenklai - Unixtime, 5 paskutiniai - mikrosekundziu hex. Kur Unixtime = DateTime::getTimestamp(), tad getTimestamp() yra kurkas maziau tikslus nei uniqid.

 

Pagal dokumentacija, jei reikia dar didesniu garantiju, kad bus unikalus vardas:


$a; $b;
$a = uniqid(NULL, TRUE);
$b = uniqid(NULL, TRUE);
echo $a;
echo "<br>";
echo $b;
--------
54afd4693be418.12512978
54afd4693be410.45279748

Tik atsargiai su tuo tasku, kad problemu nesudarytu

 

Joo, pamirsau sita fakta :D Praktiskai tik kazkada esu sukabines sitaip, kad vizualiai matytusi eiliskumas, tik atvirksciai sudedu, kad timestamp pirmas eitu :)

 

Na kad dar maziau sansu butu, kad sutaps pavadinimai, tai tiesiog gali prikabinti tarkim user_id . '_' . uniqid(NULL, TRUE) prie pavadinimo.

 

Toks naming'as turi pliusu, kad tarkim su ls -la | grep <id>_ gali susirast konkretaus userio folderius.

Redagavo Snowytiger
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jei nori pats sukurti unikalų ID nesinaudojant jokiomis ID generavimo funkcijomis, atmink, kad yra visagalis laikas, kurio neatsuksi. Jeigu dabar yra 2015-01-09 16:25:05, tai šis laikas realus tik šiai sekundei. Manipuliuok timestamp ir sukursi tikrai unikalų ID. Bėda bus tik tuo atveju, jei tą pačią sekundę keli vartotojai įvykdys skriptą. Tuomet pridėk dar kokį random iš platesnio spektro, kur būtų gal kokia viena galimybė iš milijardo sudubliuoti (error: folder exist), o klaidų milijardinėse aibėse visuomet pasitaiko, bet jų tikimybė, pripažinkime, tokia maža, kad paisyti baimės jausmo būtų kvaila.

 

<?php
if (date("s") > 20) {
$d = date("s") / 10;
} else if (date("s") > 30) {
$d = date("s") / 10;
} else if (date("s") > 40) {
$d = date("s") / 10;
} else if (date("s") > 50) {
$d = date("s") / 10;
} else if (date("s") == 0) {
$d = 7;
} else {
$d = 8;
}

$r1 = pow(time(),2);
$r3 = rand(1,999999999);
$re = $r1.$r2.$r3;
echo $re;
?>

 

Kodas netvarkingas, nepatarčiau jo naudoti, tik atsižvelgti į algoritmą. Šiuo atveju įvyktų klaida tik tuomet, jei per vieną sekundę keli vartotojai gautų tą patį random skaičių iš milijardo galimų. Kitaip jokių šansų dubliuotis, nes naudojamas timestamp (kuris dar ir šiek tiek perkoduojamas), kuris atgaline eiga neįmanomas. Tiesa, šviesi ateitis priklauso ir nuo serverio, kuriame yra APACHE. Jeigu tame serveryje staiga atsuksite laiką atgal, tuomet šis variantas - mažiau efektyvus. Norint apsisaugoti nuo to, reikėtų kiekvieną kartą generuojant ID išsaugoti timestamp - ir saugoti jį tik tuo atveju jei jis didesnis už jau esamą įrašą. Ir visą ID generavimo kodą derėtų įdėti į sąlygos sakinį, kuris deklaruotų sąlygą, kad jeigu time() >= $entry['time'] (skriptas vykdomas ne senesniu laiku, nei kada nors anksčiau), tuomet skripto vykdymas galimas.

Redagavo Bern1994
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Visvien nesuprantu, kokiu tikslu vis siuloma naudoti funkcijas, kurios yra sekundziu tikslumo, kai uniqid() yra milisekundziu tikslumo. O dar padarius uniqid(null, true) gausi galune, kuri generuojama su LCG - sis variantas vienas geresniu imanu su php, kai kalbame apie id generavima pagal esama laika. Net jei bus atsuktas serverio laikas, sansas kad bus generuojami vienodi id yra labai mazas.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Visvien nesuprantu, kokiu tikslu vis siuloma naudoti funkcijas, kurios yra sekundziu tikslumo, kai uniqid() yra milisekundziu tikslumo. O dar padarius uniqid(null, true) gausi galune, kuri generuojama su LCG - sis variantas vienas geresniu imanu su php, kai kalbame apie id generavima pagal esama laika. Net jei bus atsuktas serverio laikas, sansas kad bus generuojami vienodi id yra labai mazas.

 

Na aš tik alternatyvą funkcijoms pateikiau. Ir taip, ši funkcija yra labai gera. Milisekundžių tikslumas yra vienas iš didžiausių privalumų.

Man asmeniškai time() nepriimtinas naudoti šiuo atveju, microtime() - daug geriau. Tik jau tuomet power() pradėtų rodyti realiuosius skaičius (su E raide), todėl reikėtų keisti viršuje esantį pavyzdį.

Redagavo Bern1994
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...