Vorrei consigliare contro un 1-1 corrispondenza:
Con codifica base-64 vi sarà solo in grado di diminuire l'ingresso (4/8)/(6/8) -> 4/6 ~ 66% di dimensioni (e questo presuppone che tu abbia a che fare con i "brutti" personaggi base64 senza aggiungere nulla di nuovo).
Probabilmente considererei un metodo di ricerca (secondario) per ottenere valori veramente "carini". Una volta stabilito questo metodo alternativo, scegli come generare valori in quell'intervallo, ad es. numeri casuali - possono essere privi del valore hash di origine (poiché la corrispondenza viene persa in ogni caso) e può essere utilizzato un target-set "carino" arbitrario, forse [a-z] [A-Z] [0-9].
È possibile convertire alla base (62 sopra) semplicemente seguendo il metodo divide e Trasporta e una ricerca in una matrice. Dovrebbe essere divertente piccolo esercizio.
Nota: se si sceglie il numero casuale da [0, 62^5), si otterrà un valore che comprimerà completamente l'output codificato (e si adatta ai valori interi a 32 bit). È quindi possibile eseguire questo processo più volte di seguito per ottenere un buon valore di risultato multiplo di 5, ad esempio xxxxxyyyyyzzzzzz (dove x, y, z sono gruppi diversi e il valore totale è compreso nell'intervallo (62^5)^3 -> 62^15 -> "un valore enorme")
Modifica, per un commento:
Perché senza la corrispondenza 1-1 si può fare veramente le cose belle brevi - forse come "piccola "con una lunghezza di 8 caratteri - con base62, 8 caratteri possono memorizzare fino a 218340105584896 valori, che è probabilmente più di quanto tu abbia mai bisogno. O anche 6 caratteri che "solo" consentono la memorizzazione di 56800235584 valori diversi! (E non puoi ancora memorizzare quel numero in un semplice numero intero a 32 bit :-) Se passi a 5 caratteri, riduci di nuovo lo spazio (a poco meno di un miliardo: 916,132,832), ma ora hai qualcosa che può inserirsi in un intero con segno a 32 bit (anche se è un po 'dispendioso).
Il DB non dovrebbe garantire duplicati, anche se un indice su questo valore sarà "frammentazione rapida" con una fonte casuale (ma è possibile utilizzare contatori o quant'altro). Un PRNG ben distribuito dovrebbe avere conflitti minimi (leggi: tentativi) in un intervallo abbastanza ampio (supponendo che tu mantenga il seme in rotazione e non lo reimposti, o resettato in modo appropriato) - Super 7 può anche garantire NESSUN duplicato durante un ciclo (di soli ~ 32k), ma come potete vedere sopra, lo spazio di destinazione è ancora grande. Vedere la matematica in cima a ciò che richiede il mantenimento di una relazione 1-1 in termini di dimensione minima codificata .
Il metodo divide-and-carry spiega solo come ottenere il numero sorgente in una base diversa, forse base62. Lo stesso metodo generale può essere applicato per passare dalla base "naturale" (base10 in PHP) a qualsiasi base.
Con codifica base-64 vi sarà solo in grado di diminuire l'ingresso (4/8)/(6/8) -> 4/6 ~ 66% in termini di dimensioni (e questo presuppone che tu abbia a che fare con i "brutti" personaggi base64 senza aggiungere nulla di nuovo). Probabilmente considererei un metodo di ricerca (secondario) per ottenere valori veramente "belli". –
Re "Quindi penso che voglio qualcosa che non converta direttamente da esadecimale a base 62." - Se vuoi codificare 16 byte in una stringa sicura per URL, la mia risposta di seguito (22 caratteri) è probabilmente la migliore che otterrai. Cosa stai cercando di ottenere? – dkamins