Le but d'y faire aléatoirement c'était pour que ça soit unique avec chiffres et lettres pour avoir toute les combinaison possible, mais ton idée est génial!!! Je trouve juste dommage qu'au début ça commence a un caractère, mais c'est pas grave^^.
En plus même pas de contrôle a faire en BDD si j'utilise l'id qui est forcément unique!!! On peut même tester la class sur l'id de la table et donc ça évite d'avoir une colonne avec la clé, c'est encore mieux.
J'ai trouvé cette fonction:
<?php
/**
* Base n encode /decode
* @author CrazyCat
* @package Mephisto::Maths
*/
class NBase {
/**
* Array of chars to use
* @var array
*/
private $vals = array(
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
);
/*
* Base to use
* @var int
*/
private $base = 10;
/**
* Constructor
* @param int $n Base to use
*/
public function __construct($n=10) {
$this->setBase($n);
}
/**
* Sets the destination base
* @param int $n Base to use
*/
public function setBase($n=10) {
if ($n < 2 || $n > count($this->vals)) {
$n = count($this->vals);
}
$this->base = $n;
}
/**
* Gets the destination base
* @return int
*/
public function getBase() {
return $this->base;
}
/**
* Encodes integer to new base
* @param integer $b10 Integer in base 10
* @return string
*/
public function encode($b10) {
$bn = '';
$current = $b10;
while($current > 0) {
$rest = $this->modulo($current, $this->base);
$bn .= $this->vals[$rest];
$current = floor($current/$this->base);
}
return strrev($bn);
}
/**
* Decodes string from base
* @param string $bn String in base n
* @return integer
*/
function decode($bn) {
$bn = strrev($bn);
$b10 = 0;
for($i=0; $i<strlen($bn); $i++) {
$item = substr($bn, $i, 1);
$pos = array_search($item, $this->vals);
$b10 += $pos * pow($this->base, $i);
}
return $b10;
}
/**
* Calculates a modulus
* To use because native "%" is buggy
* for big values
* @param integer $val
* @param integer $div Divisor
* @return integer remainder
*/
function modulo($val, $div) {
$r = $val - (floor($val/$div)*$div);
return $r;
}
}
// Un petit test:
for($i=1; $i<=100; $i++)
{
$test = $i;
$bn = new NBase(62);
$try1 = $bn->encode($test);
$try2 = $bn->decode($try1);
echo $test, ' gives in base ', $bn->getBase(), ': <b>', $try1, '</b> decoded as ', $try2, '<br>';
}
?>