[PHP] funckcja losowego stringa, czy może się powtórzyć?


(pain3hp) #1
function random_string($length){

  $string = sha1(time());

  $string = substr($string,0,$length);

  return($string);

}

używał go będę zawsze

random_string(40)

czy jest taka możliwość że zwróci mi takie same stringi nawet gdybym puścił ją dwa razy w przeciągu 0,001ms ?


(M@ster) #2

time() zwraca tzw. timestamp (w sekundach), więc jak najbardziej zwróci to samo w obrębie tej samej sekundy.

Polecam funkcję microtime(), albo jeszcze lepiej mt_rand() bo zrobienie własnego generatora nie jest prostą sprawą.


(kostek135) #3

Hmm dziwny kod czy 3 linijka to nie jest $string = $string substr pobierze od 0 do 40 znaki z 40 znakowego hash'a?

Tak po za tym pytasz czy nie jest możliwe aby został zwrócony ten sam string dla różnych czasów cóż czas w przybliżeniu biegnie do nieskończoności, liczba wygenerowanych hash-y jest skończona (alfabet+cyfry kombinacji) sam sobie odpowiedz.


(pain3hp) #4

znacie funkcję która da mi 40 znakowego stringa? będę je wrzucał do bazy wiec nie musi być 100% pewności ale zeby było jak najmniej prawdopodobne by zwracała tego stringa unikatowego

a co w przypadku gdybym jeszcze przepuścił ten czas przez md5 ?


(kostek135) #5

Jeżeli nie musi być 100% pewności, że jest unikatowy, może być sposób podany przez M@ster'a z mt_rand przepuszczonym przez sha1, ten substr pomiń bo dla 0,40 nic nie robi tak naprawdę dla tego wejścia. Przepuszczanie przez sha1 i md5 czegokolwiek jest bez sensu i nie daje nawet odrobiny bezpieczeństwa więcej, obie funkcje generowane są algorytmicznie dlatego samego wejścia jest to samo wyjście.


(M@ster) #6

Ja bym proponował mt_rand połączyć z microtime i dopiero z tego wyciągać sha1. Trudno znaleźć jeszcze inne źródła losowości do dorzucenia (chociaż można dorzucić do tego ilość istniejących już rekordów w bazie). Na sam koniec można wymieszać ciąg znakowy przestawiając np: 1000 razy losowe pary znaków w nim.

Teraz co do sytuacji z bazą danych. Losujesz randomowego hasha, spr. czy istnieje, jeśli nie, dodajesz, jeśli istnieje losujesz znowu - szanse że trafisz na przypadek z istniejącym są bliskie zeru a takich powtórnych losowań można zrobić spokojnie ze 100 bez widocznego spowolnienia całego procesu. Także taka metoda daje Ci blisko 100% gwarancji poprawnego działania.


(Xds) #7

40 znakowy losowy hash

sha1(uniqid(rand(), true));

(pain3hp) #8

dzieki za informacje ale czy moglibyście podać mi tę funkcję, sory za leniwość ale musze szybko skończyć ten projekt i nie chce tracić czasu na takie szczegóły, proszę o funkcję tak bym mógł ją wywołać z argumentem ilości znaków czyli to co podałem na początku tylko już po Waszych korektach...

jeszcze raz wielkie dzieki!