Blame view

sources/apps/contacts/lib/utils/uuid.php 2.12 KB
6d9380f96   Cédric Dupont   Update sources OC...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  <?php
  namespace OCA\Contacts\Utils;
  
  class UUID {
  
  	protected $urand;
  
  	public function __construct() {
  		$this->urand = @fopen ( '/dev/urandom', 'rb' );
  	}
  
  	/**
  	* @brief Generates a Universally Unique IDentifier, version 4.
  	*
  	* This function generates a truly random UUID. The built in CakePHP String::uuid() function
  	* is not cryptographically secure. You should uses this function instead.
  	* From http://php.net/manual/en/function.uniqid.php comments
  	*
  	* @see http://tools.ietf.org/html/rfc4122#section-4.4
  	* @see http://en.wikipedia.org/wiki/UUID
  	* @return string A UUID, made up of 32 hex digits and 4 hyphens.
  	*/
  	public function get() {
  
  		$prBits = false;
  		if (is_a($this, 'uuid')) {
  			if (is_resource($this->urand)) {
  				$prBits .= @fread($this->urand, 16);
  			}
  		}
  		if (!$prBits) {
  			$fp = @fopen('/dev/urandom', 'rb');
  			if ($fp !== false) {
  				$prBits .= @fread($fp, 16);
  				@fclose ( $fp );
  			} else {
  				// If /dev/urandom isn't available (eg: in non-unix systems), use mt_rand().
  				$prBits = "";
  				for($cnt = 0; $cnt < 16; $cnt ++) {
  					$prBits .= chr(mt_rand(0, 255));
  				}
  			}
  		}
  		$timeLow = bin2hex(substr($prBits, 0, 4));
  		$timeMid = bin2hex(substr($prBits, 4, 2));
  		$timeHiAndVersion = bin2hex(substr($prBits, 6, 2));
  		$clockSeqHiAndReserved = bin2hex(substr($prBits, 8, 2));
  		$node = bin2hex(substr($prBits, 10, 6));
  
  		/**
  		* Set the four most significant bits (bits 12 through 15) of the
  		* time_hi_and_version field to the 4-bit version number from
  		* Section 4.1.3.
  		* @see http://tools.ietf.org/html/rfc4122#section-4.1.3
  		*/
  		$timeHiAndVersion = hexdec($timeHiAndVersion);
  		$timeHiAndVersion = $timeHiAndVersion >> 4;
  		$timeHiAndVersion = $timeHiAndVersion | 0x4000;
  
  		/**
  		* Set the two most significant bits (bits 6 and 7) of the
  		* clock_seq_hi_and_reserved to zero and one, respectively.
  		*/
  		$clockSeqHiAndReserved = hexdec($clockSeqHiAndReserved);
  		$clockSeqHiAndReserved = $clockSeqHiAndReserved >> 2;
  		$clockSeqHiAndReserved = $clockSeqHiAndReserved | 0x8000;
  
  		return sprintf('%08s-%04s-%04x-%04x-%012s', $timeLow, $timeMid, $timeHiAndVersion, $clockSeqHiAndReserved, $node);
  	}
  
  }