GUID-generaattori

emoporo 02.10.04 13:40

Tekee random GUIDeja tyyliin {AA34AB9E-F40A-4F20-AA18-E74FA957F34E}

 Tekstiversio  Arvo: 6 (18 ääntä)  Äänestä: +  -
<?php
/*  (c) Joonas Loppi / joonas.loppi@xs.fi

    Changed: 02.10.2004 (dd.mm.yyyy)
    License: http://creativecommons.org/licenses/by-nc/2.0/

    --- Description ---
    GUID (Globally Unique IDentifier) generator.
    The result looks like this:  {AA34AB9E-F40A-4F20-AA18-E74FA957F34E}

    --- Example ---
    $guid = generateGuid();
    print $guid;
*/


function generateGuid() {
    $out = '';

    // Seed the random number generator
    list($usec, $sec) = explode(' ', microtime());
    srand((float)$sec+((float)$usec*100000));

    for($i = 0; $i < 40; $i++)
      switch($i) {
        case 0:
          $out .= '{';
          break;
        case 9:
        case 14:
        case 19:
        case 24:
          $out .= '-';
          break;
        case 39:
          $out .= '}';
          break;
        default:
          $out .= rand(0, 1) ? chr(rand(65, 90)) : chr(rand(48, 57));
    }

    return $out;
}

?> 

editoitu: 13:46 2.10.04
Akiro 13:45 2.10.04 
Mitäs vikaa on PHP:n manuaalin ehdottamassa tavassa, kts http://fi2.php.net/uniqid
$unique = md5(uniqid(rand(), true));
Toki tuossa ei ole noita staileja väliviivoja mutta saahan nekin siihen pienellä vaivalla ;-)
Ztane 14:02 2.10.04 
ja kun jakauma ei oo tasanen jne... jne...
emoporo 23:42 2.10.04 
Akiro: Koodin tarkoituksena on todellakin tehdä validi GUID, eikä mitään random hashia.

Ztane: Tuo jakauma nyt riippuu ihan minun koodistani riippumattomista asioista, kun PHP:n rand() funktiota käyttää ja näyttää välillä palauttavan samoja arvoja. Mitenkään itse en siihen voi vaikuttaa.


3 arvostelua eli kolme negatiivista. En nyt usko että koodinpätkä noin huono oli.
En tiedä kiinnostaako ketään mutta alkaa tänne kuhaan postaaminen olla niin epäpalkitsevaa ja muuta ei saa kuin haukkuja niin oli viimeinen kerta kun tänne tulen.

Anteeksi kiroiluni mutta tämä paikka on täynnä vihamielisiä paskoja.
ane 23:47 2.10.04 
No annoin pisteen säälistä. Oletko tyytyväinen? Ota keksi _o/
editoitu: 00:37 3.10.04
Akiro 00:27 3.10.04 
En kyllä tajua mistä poro meidät vihamielisiksi väänsi.

a) En edes äänestänyt, kunhan ihmettelin mitä eroa tuossa on tuohon toiseen tapaan, uniikki id siinäkin tehdään vaikka sen perustana onkin hashi.

b) Nyt kun äänestin äänestikin kylläkin plussaa, ei tuossa koodissa mitään vikaa ole, vaikka hyötyä en itse näekään.

c) Muiden ajatustenjuoksua en kyllä pysty lukemaan, eli hankala sanoa mistä jotkut 3 ovat sen miinuksen antaneet, mutta useampihan tuolle plussaa on antanut, tällä hetkellä ainakin..
Entropia 00:59 3.10.04 
Valitettava tosiasia on että suurin osa porukasta antaa miinuksen kaikille sellaisille pätkille mistä ei heille itselleen ole hyötyä tai eivät tajua mitä sillä tehdään, ja plussan kaikille "^___^ MUN VIERAS KIRJA ^___^" -viritelmille. Omasta mielestäni skriptisi on helppoa luettavaa ja hyvin toteutettu, helppo ottaa käyttöön omassa skriptissä ja joillekkin varmasti hyödyllinen joten annoin plussan. Postaa toki lisää skriptejäsi kuhaan tulevaisuudessa, äläkä ota itseesi jos saat miinusta.
T.M. 16:43 3.10.04 
Itse annoin miinuksen koska tämä oli niin huonosti toteutettu.
makeuu 17:37 3.10.04 
plus.. :)
Entropia 19:37 3.10.04 
T.M. kirjoitti:
Itse annoin miinuksen koska tämä oli niin huonosti toteutettu.

Perustelut, kiitos?
T.M. 00:44 4.10.04 
Kaarisulkeet lisätään merkkijonoon silmukan sisällä, vaikka silmukan ulkopuolella on paljon järkevämpää lisätä tuollaiset.
Sekä tuossa käytetään list() funktiota, joka on aivan turhaan koska kyseisiä muuttujia ei käytetä kuin kerran.

emoporo kirjoitti:
Anteeksi kiroiluni mutta tämä paikka on täynnä vihamielisiä paskoja.
Olenko minä nyt sitten vihamielinen paska kun kerron mitä mieltä olen toteutuksestasi?
Entil-zha 07:57 4.10.04 
Hmm... mielenkiintoista vääntöä plussista ja miinuksista. Eikös ne voitaisi poistaa kokonaan niin ei kenenkään virtuaalipippeliin pääsisi sattumaan. Ja sitten asiaan. En valitettavasti jaksanut katsoa koodia sen tarkemmin kun asia ei sinänsä kiinnosta mutta ainakin ulkoasu helposti luettavissa.
emoporo 16:56 6.10.04 
T.M. kirjoitti:
Kaarisulkeet lisätään merkkijonoon silmukan sisällä, vaikka silmukan ulkopuolella on paljon järkevämpää lisätä tuollaiset.
Sekä tuossa käytetään list() funktiota, joka on aivan turhaan koska kyseisiä muuttujia ei käytetä kuin kerran.

Kaarisulkeiden ja väliviivojen lisäämisessä olet oikeassa, mutta tälläisessa koodinpätkässä sillä ei ole paljoakaan väliä.
Jos luupissa täyttäisi kaikki ~40 charia rand():eilla ja sitten korvaisi vasta lopuksi osan niistä kaarisulkeilla ja viivoilla niin tulisi turhia kutsuja rand():ille, joka vie hieman enemmän prosessoriaikaa kuin mitä kuluisi tekemällä kaarisulkeet ja viivat luupin sisällä. Konsultoippa vaikka PHP:n lähdekoodeja niin huomaat että se rand() ei ole mikään yksinkertainen ja supernopea funktio.

list($usec, $sec) = explode(' ', microtime());

On sitä varten että explode() palauttaa arrayn, ja käyttämällä list() funktiota minun ei tarvitse tehdä uutta väliaikaista muuttujaa.
Näytämpä miten se tapahtuisi ilman listiä.
$tmp = explode(' ', microtime());
$usec = $tmp[0];
$sec = $tmp[1];
unset($tmp);

Kerrohan minulle kumpi on hienommin tehty?

T.M. kirjoitti:
Olenko minä nyt sitten vihamielinen paska kun kerron mitä mieltä olen toteutuksestasi?

Et sen takia, vaan turhan pätemisen ja pilkunnussimisen.
T.M. 18:19 6.10.04 
Huoh... Ensiksi käsketään perustella, sitten kun perustellaan niin saadaan paskat naamalle.
Taidanpa jättää nämä "negatiiviset" perustelut sitten kokonaan pois, niin kaikki ovat iloisia.
Khaani 18:25 6.10.04 
T.M. kirjoitti:
Huoh... Ensiksi käsketään perustella, sitten kun perustellaan niin saadaan paskat naamalle.
Taidanpa jättää nämä "negatiiviset" perustelut sitten kokonaan pois, niin kaikki ovat iloisia.


Oot sää kyllä hauska :P
Ztane 22:52 6.10.04 
emoporo kirjoitti:
Konsultoippa vaikka PHP:n lähdekoodeja niin huomaat että se rand() ei ole mikään yksinkertainen ja supernopea funktio.

Eikö...

#ifdef ZTS
        ret = php_rand_r(&BG(rand_seed));
#else
# if defined(HAVE_RANDOM)
        ret = random();
# elif defined(HAVE_LRAND48)
        ret = lrand48();
# else
        ret = rand();
# endif
#endif


kutsuu mun mielestä iha yksinkertasesti systeemin randomifunkkareita. Se mikä mua häirittee on että nyt yllättäin saadaan aikaan vaa 2^32 erilaista identifieriä 2^128:n sijasta.
d0ggie 23:33 6.10.04 
sub get_guid { my $guid = shift || '{        -    -    -    -            }'; $guid =~ s/\s/('A'..'F', 0..9)[rand 16]/eg; $guid }


Kyllä Perl omistaa kun voi käyttää hieman lyhyempiäkin tapoja. Välilyönnihän voi esimerkiksi korvata numeroilla ja heittää s/[\s\d]/.../ niin guidit voi antaa vaikka selkeään "'{12345678-1234-1234-1234-123456789012}" tyyliin. PHP:llä tämä tapa onnistuu myös, mutta kauneus ja selkeys on kyllä kiitos preg_replace():n siellä miinuksen puolella.
Ztane 00:43 7.10.04 
Ztane kirjoitti:
kutsuu mun mielestä iha yksinkertasesti systeemin randomifunkkareita. Se mikä mua häirittee on että nyt yllättäin saadaan aikaan vaa 2^32 erilaista identifieriä 2^128:n sijasta.

Ja mikä pahempaa, jos noita käytetään josain tietokannassa nii kiitos "birthday 'paradoxin'" ei tarvi tehä kun keskimäärin 65000 GUIDia niin alkaa jo paukkua. Ei maha olla kovin "Globally Uniquesta sillon hyötyy".
editoitu: 18:08 7.10.04
Ztane 18:07 7.10.04 
/* luo GUIDeja eli niitä Microsoftin jokapaikkaan tunkemia härpäkkeitä muotoa
  [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}
  (eli näyttää tältä: {7300C91D-23D4-247D-9A7C-91AC21DAA2CF})
*/
<?php
function generate_GUID() {
        $t = strtoupper(md5($HTTP_SERVER_VARS[SERVER_NAME] . uniqid('', true)));
        return '{'
                . substr($t,  0,  8) . '-'
                . substr($t,  8,  4) . '-'
                . substr($t, 12,  4) . '-'
                . substr($t, 16,  4) . '-'
                . substr($t, 20)
        . '}';
}
?>
Ztane 23:47 10.10.04 
Pitäs vielä tähän varmaanki huomauttaa että oikeita GUIDeja/UUIDeja nää ei oo! kukaan ei takaa että olisivat muutenkaan uniikkeja
Jake-san 14:47 1.2.06 
Teki mitä sanoi tekevänsä, joten annan tietysti plussaa.. Ulkoasun ja rakenne on asia erikseen, pääasiahan on se, että koodi toimii.
cMaster 12:07 12.6.07 
Jake-san kirjoitti:
Teki mitä sanoi tekevänsä, joten annan tietysti plussaa.. Ulkoasun ja rakenne on asia erikseen, pääasiahan on se, että koodi toimii.

samaa mieltä :)