Breve ID unico in PHP


Answers

@gen_uuid () di gord.

preg_replace ha alcuni brutti problemi di utf-8, che fanno sì che i secondi di UID contengano "+" o "/". Per aggirare questo, devi esplicitamente rendere il modello utf-8

function gen_uuid($len=8) {

    $hex = md5("yourSaltHere" . uniqid("", true));

    $pack = pack('H*', $hex);
    $tmp =  base64_encode($pack);

    $uid = preg_replace("#(*UTF8)[^A-Za-z0-9]#", "", $tmp);

    $len = max(4, min(128, $len));

    while (strlen($uid) < $len)
        $uid .= gen_uuid(22);

    return substr($uid, 0, $len);
}

Mi ci è voluto un po 'per trovarlo, forse è un altro mal di testa

Question

Voglio creare un ID univoco ma uniqid() sta dando qualcosa come '492607b0ee414' . Quello che vorrei è qualcosa di simile a ciò che tinyurl dà: '64k8ra' . Più corto, meglio è. Gli unici requisiti sono che non dovrebbe avere un ordine evidente e che dovrebbe apparire più carino di una sequenza di numeri apparentemente casuale. Le lettere sono preferite rispetto ai numeri e idealmente non sarebbe un caso misto. Poiché il numero di voci non sarà così elevato (fino a 10000 o giù di lì) il rischio di collisione non è un fattore enorme.

Ogni suggerimento è apprezzato.




function rand_str($len = 12, $type = '111', $add = null) {
    $rand = ($type[0] == '1'  ? 'abcdefghijklmnpqrstuvwxyz' : '') .
            ($type[1] == '1'  ? 'ABCDEFGHIJKLMNPQRSTUVWXYZ' : '') .
            ($type[2] == '1'  ? '123456789'                 : '') .
            (strlen($add) > 0 ? $add                        : '');

    if(empty($rand)) $rand = sha1( uniqid(mt_rand(), true) . uniqid( uniqid(mt_rand(), true), true) );

    return substr(str_shuffle( str_repeat($rand, 2) ), 0, $len);
}






Ecco la routine che uso per base62 casuali di qualsiasi lunghezza ...

Chiamando gen_uuid() restituisce stringhe come WJX0u0jV, E9EMaZ3P ecc.

Di default questo restituisce 8 cifre, quindi uno spazio di 64 ^ 8 o circa 10 ^ 14, questo è spesso sufficiente a rendere le collisioni piuttosto rare.

Per una stringa più grande o più piccola, passare $ len come desiderato. Nessun limite di lunghezza, come appendo fino a quando non è soddisfatto [fino al limite di sicurezza di 128 caratteri, che può essere rimosso].

Nota, usa un sale casuale all'interno di md5 [o sha1 se preferisci], quindi non può essere facilmente decodificato.

Non ho trovato alcuna conversione di base62 affidabile sul web, quindi questo approccio di rimuovere i caratteri dal risultato base64.

Usare liberamente con la licenza BSD, divertiti,

Gord

function gen_uuid($len=8)
{
    $hex = md5("your_random_salt_here_31415" . uniqid("", true));

    $pack = pack('H*', $hex);

    $uid = base64_encode($pack);        // max 22 chars

    $uid = ereg_replace("[^A-Za-z0-9]", "", $uid);    // mixed case
    //$uid = ereg_replace("[^A-Z0-9]", "", strtoupper($uid));    // uppercase only

    if ($len<4)
        $len=4;
    if ($len>128)
        $len=128;                       // prevent silliness, can remove

    while (strlen($uid)<$len)
        $uid = $uid . gen_uuid(22);     // append until length achieved

    return substr($uid, 0, $len);
}



Potresti usare l'Id e convertirlo in base-36 se vuoi convertirlo avanti e indietro. Può essere utilizzato per qualsiasi tabella con un numero intero.

function toUId($baseId, $multiplier = 1) {
    return base_convert($baseId * $multiplier, 10, 36);
}
function fromUId($uid, $multiplier = 1) {
    return (int) base_convert($uid, 36, 10) / $multiplier;
}

echo toUId(10000, 11111);
1u5h0w
echo fromUId('1u5h0w', 11111);
10000

Le persone intelligenti possono probabilmente capirlo con sufficienti esempi di id. Non lasciare che questa oscurità sostituisca la sicurezza.




Esistono due modi per ottenere un ID univoco affidabile: renderlo così lungo e variabile che le probabilità di una collisione sono ridotte in modo spettacolare (come con un GUID) o archiviare tutti gli ID generati in una tabella per la ricerca (in memoria o in un DB o un file) per verificare l'unicità alla generazione.

Se stai davvero chiedendo come è possibile generare una chiave così breve e garantire la sua unicità senza una sorta di controllo duplice, la risposta è, non è possibile.




Puoi anche farlo come tih:

public static function generateCode($length = 6)
    {
        $az = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $azr = rand(0, 51);
        $azs = substr($az, $azr, 10);
        $stamp = hash('sha256', time());
        $mt = hash('sha256', mt_rand(5, 20));
        $alpha = hash('sha256', $azs);
        $hash = str_shuffle($stamp . $mt . $alpha);
        $code = ucfirst(substr($hash, $azr, $length));
        return $code;
    }