Autor Zpráva
Meldo
Profil
Potreboval by som vygenerovat absolutne unikatny retazec, ktory bude pomenovavat subory na servery a ja nechcem, aby sa mi subory prepisovali. Pouzil som nasledujuci kod:

<?php

$a = microtime();
$b = rand(1000000, 9000000000);
$c = microtime();

$d = sha1($a.$b.$c);
echo $d;
?>


Je nejaka moznost ze sa retazec bude opakovat?
koudi
Profil
Imho by mohlo stačit jenom normální unixovej timestamp. Záleží na tom, jestli je nějaká možnost, že by třeba probíhaly dvě takovýhle operace najednou. Pak by tam ještě mělo smysl dávat ten microtime. Takhle jak to máš, mi to přijde až dost složitý. zbytečně.
Peca
Profil
Použití sha1 imho naopak zvyšuje pravděpodobnost, že řetězec již existuje.
$a a $c mají stejnou hodnotu.
koudi
Profil
Použití sha1 imho naopak zvyšuje pravděpodobnost, že řetězec již existuje.
Imho vůbec ne.
Oswald
Profil
do {

$fileName = uniqid() . '.txt';
} while(file_exists($fileName));
nightfish
Profil
Použití sha1 imho naopak zvyšuje pravděpodobnost, že řetězec již existuje.
Imho vůbec ne.

vzhledem k tomu, že sha1 je hashovací funkce, která mapuje nekonečné množství vstupů na konečný počet výstupů, tak má Peca pravdu, nicméně reálně bych se tohoto problému neobával
Joker
Profil
Meldo
Kolik těch souborů budete generovat?

IMHO by na unikátní ID stačilo
$id = md5(microtime());

Ale jinak by bylo nejlepší řešení testovat, jestli soubor už existuje, jak psal Oswald... a pak se dají soubory pojmenovávat klidně číselným indexem, třeba:

$i = 0;
do{
$i++;
$jmeno = $i.".txt";
} while(file_exists($jmeno));
koudi
Profil
nightfish
vzhledem k tomu, že sha1 je hashovací funkce, která mapuje nekonečné množství vstupů na konečný počet výstupů, tak má Peca pravdu, nicméně reálně bych se tohoto problému neobával
Když to bereš takhle, tak samozřejmě ano. Já sem vycházel z příkladu v prvnim příspěvku, kdy se jako paramatr používá aktuální timestamp...a jelikož ten nikdy nebude stejný s nějakým zpětně použítým, tak v tom problém nevidím...
Joker
Profil
koudi
Já sem vycházel z příkladu v prvnim příspěvku, kdy se jako paramatr používá aktuální timestamp...a jelikož ten nikdy nebude stejný s nějakým zpětně použítým, tak v tom problém nevidím...
Nojo, jenže hashovací funkce může pro dva různé řetězce generovat stejný hash (tomu se říká "kolize").
Podle mě je nejlepší řešení testovat existenci toho souboru. Pak je jisté, že jméno bude unikátní.
Meldo
Profil
koudi
Ano. Je tam moznost, ze dve operacie prebehnu v rovnaku dobu. Mozno len teoreticka, ale predsa.

Joker
To prave neviem. Mozu ich byt aj tisice a v ziadnom pripade sa nesmu prepisat (rovnaky nazov). Napadlo ma aj to, ze by bolo najlepsie testovat ci subor existuje, ale neviem ci to nebude moc pomale, ked to bude testovat napr. 50 000 suborov.
pmasarik
Profil
Osobne si generujem unikátne ID takto:

$kod = substr (md5(uniqid(rand(),1)), 3, 10);


Ďalej by som si tento kód uložil do DB v stĺpci ktorý je nastavený na unique.
Ak budeš zapisovať nový kód do DB a ten tam už náhodou bude tak neprepíšeš súbor ale to patrične ošetríš.
krteczek
Profil
no a co nejprve zapsat existenci souboru do databáze, tím dostaneš unikátní id vždycky (autoincrement) a její id hashovat?kolize u krátkých četězců do 30 znaků bych se neobával...
krteczek
Toto téma je uzamčeno. Odpověď nelze zaslat.

0