<?php
/**
* UniqID - advanced uniqid
* by Till Wehowski (webfan.de)
* (c) Do What The Fuck You Want To Public License (ipConvert: //http://php.net/manual/de/function.ip2long.php)
*
*
* Example:
*
<?php
$pfx = (isset($_GET['pfx'])) ? strip_tags($_GET['pfx']) : '';
$suffix = (isset($_GET['suffix'])) ? strip_tags($_GET['suffix']) : '';
$delimiter = (isset($_GET['delimiter'])) ? strip_tags($_GET['delimiter']) : false;
echo UniqID::gen($pfx, $suffix, $delimiter);
?>?pfx=pre&suffix=-suff&delimiter=-
results in=>e.g.:
pre-18e860-0av54a-f9oy0kowxl-c2q5ytoc6ij306-suff
*
*/
class UniqID
{
const T = 1460655712;
public $id = null;
protected $pfx;
protected $suffix;
protected $delimiter;
protected $max;
protected $pad;
public function __construct($pfx='', $suffix = ''/* '.suffix' */, $delimiter = false, $max = 99999999, $pad = '0'){
$this->pfx =$pfx;
$this->suffix= $suffix;
$this->delimiter =$delimiter;
$this->max= $max;
$this->pad = $pad;
$this->id = $this->uniqid();
}
public static function gen($pfx='', $suffix = ''/* '.suffix' */, $delimiter = false, $max = 99999999, $pad = '0'){
$s = new self($pfx, $suffix, $delimiter, $max, $pad);
return $s->id;
}
protected function ipConvert($ipAddress ='', $basis = 36, $strPad = false) {
if(''===$ipAddress)$ipAddress=getEnv("REMOTE_ADDR");
$hex = '';
if(strpos($ipAddress, ',') !== false) {
$splitIp = explode(',', $ipAddress);
$ipAddress = trim($splitIp[0]);
}
$isIpV6 = false;
$isIpV4 = false;
if(filter_var($ipAddress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) {
$isIpV6 = true;
}
else if(filter_var($ipAddress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) {
$isIpV4 = true;
}
if(!$isIpV4 && !$isIpV6) {
return false;
}
// IPv4 format
if($isIpV4) {
$parts = explode('.', $ipAddress);
for($i = 0; $i < 4; $i++) {
$parts[$i] = str_pad(dechex($parts[$i]), 2, '0', STR_PAD_LEFT);
}
$ipAddress = '::'.$parts[0].$parts[1].':'.$parts[2].$parts[3];
$hex = join('', $parts);
}
// IPv6 format
else {
$parts = explode(':', $ipAddress);
// If this is mixed IPv6/IPv4, convert end to IPv6 value
if(filter_var($parts[count($parts) - 1], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) {
$partsV4 = explode('.', $parts[count($parts) - 1]);
for($i = 0; $i < 4; $i++) {
$partsV4[$i] = str_pad(dechex($partsV4[$i]), 2, '0', STR_PAD_LEFT);
}
$parts[count($parts) - 1] = $partsV4[0].$partsV4[1];
$parts[] = $partsV4[2].$partsV4[3];
}
$numMissing = 8 - count($parts);
$expandedParts = array();
$expansionDone = false;
foreach($parts as $part) {
if(!$expansionDone && $part == '') {
for($i = 0; $i <= $numMissing; $i++) {
$expandedParts[] = '0000';
}
$expansionDone = true;
}
else {
$expandedParts[] = $part;
}
}
foreach($expandedParts as &$part) {
$part = str_pad($part, 4, '0', STR_PAD_LEFT);
}
$ipAddress = join(':', $expandedParts);
$hex = join('', $expandedParts);
}
// Validate the final IP
if(!filter_var($ipAddress, FILTER_VALIDATE_IP)) {
return false;
}
$hex = base_convert($hex, 16, $basis);
if(false===$strPad){
return $hex.str_pad(strlen($hex), 2, '0', STR_PAD_LEFT);
}else{
return strtolower(str_pad($hex, 32, '0', STR_PAD_LEFT));
}
}
protected function uniqid() {
$pfx = $this->pfx;
$suffix = $this->suffix;
$delimiter = $this->delimiter;
$max = $this->max;
$pad = $this->pad;
if(true===$delimiter){$delimiter='-';}
elseif(false===$delimiter){$delimiter='';}
elseif(is_string($delimiter)){$delimiter=$delimiter;}
else{$delimiter='';}
$s = uniqid('', true);
$hex = substr($s, 0, 13);
$dec = $s[13] . substr($s, 15);
mt_srand((double)microtime() * 1000000);
$rand = mt_rand(1,$max);
return $pfx
.((''!==$pfx) ? $delimiter : '')
.str_pad(base_convert($rand, 10, 36), strlen((string)base_convert($max, 10, 36)), $pad, STR_PAD_LEFT)
.$delimiter
.str_pad( base_convert(time()-self::T, 10, 36), 6, $pad, STR_PAD_LEFT)
.$delimiter
.base_convert($hex, 16, 36)
.$delimiter
. base_convert($dec, 10, 36)
. $this->ipConvert()
.$suffix
;
}
}
|