| 
<?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
 ;
 
 }
 
 
 
 
 }
 |