2009-09-19 14 views

risposta

19

EDIT:

Yikes! Ho dimenticato di questa mia antica risposta. Per chiarire la confusione creata dalla mia ingenuità (coerente con i commenti riportati di seguito): MD5 (come la maggior parte degli hash utili, per loro natura) sono non injective, quindi il loro output non è garantito per essere univoco per tutti gli input.

Se le collisioni di hash sono un problema (in questo caso, lo sono), l'utilizzo di questa tecnica richiederà il controllo, dopo l'hashing, se una chiave identica è già stata generata.


Dal uniqid utilizza l'ora attuale in microsecondi per generare il GUID, non v'è praticamente alcuna possibilità che tu abbia mai incorrere nello stesso due volte.

Quindi, se lo si utilizza solo per creare nomi di file univoci, uniqid() sarà sufficiente. Se si vuole impedire agli utenti di indovinare il guid, si potrebbe anche renderlo più difficile e md5 pure.

+1

Mi piace l'idea di md5'ing it :) –

+4

Ma MD5 doesn preservare l'unicità – Gumbo

+2

Se md5 una chiave che è già unica, rimarrà unica. – BraedenP

6

GUID è la versione di UUID di Microsoft. PHP uniqid è la versione 4 di UUID. Decisamente buono.

2

anche io voglio creare guid per chiamare API .NET e questa funzione generare una chiave in formato GUID e funziona per me

function generateGuid($include_braces = false) { 
    if (function_exists('com_create_guid')) { 
     if ($include_braces === true) { 
      return com_create_guid(); 
     } else { 
      return substr(com_create_guid(), 1, 36); 
     } 
    } else { 
     mt_srand((double) microtime() * 10000); 
     $charid = strtoupper(md5(uniqid(rand(), true))); 

     $guid = substr($charid, 0, 8) . '-' . 
       substr($charid, 8, 4) . '-' . 
       substr($charid, 12, 4) . '-' . 
       substr($charid, 16, 4) . '-' . 
       substr($charid, 20, 12); 

     if ($include_braces) { 
      $guid = '{' . $guid . '}'; 
     } 

     return $guid; 
    } 
} 
Problemi correlati