]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Lib/uuid.py
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Lib / uuid.py
CommitLineData
4710c53d 1r"""UUID objects (universally unique identifiers) according to RFC 4122.\r
2\r
3This module provides immutable UUID objects (class UUID) and the functions\r
4uuid1(), uuid3(), uuid4(), uuid5() for generating version 1, 3, 4, and 5\r
5UUIDs as specified in RFC 4122.\r
6\r
7If all you want is a unique ID, you should probably call uuid1() or uuid4().\r
8Note that uuid1() may compromise privacy since it creates a UUID containing\r
9the computer's network address. uuid4() creates a random UUID.\r
10\r
11Typical usage:\r
12\r
13 >>> import uuid\r
14\r
15 # make a UUID based on the host ID and current time\r
16 >>> uuid.uuid1()\r
17 UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')\r
18\r
19 # make a UUID using an MD5 hash of a namespace UUID and a name\r
20 >>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')\r
21 UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')\r
22\r
23 # make a random UUID\r
24 >>> uuid.uuid4()\r
25 UUID('16fd2706-8baf-433b-82eb-8c7fada847da')\r
26\r
27 # make a UUID using a SHA-1 hash of a namespace UUID and a name\r
28 >>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')\r
29 UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')\r
30\r
31 # make a UUID from a string of hex digits (braces and hyphens ignored)\r
32 >>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')\r
33\r
34 # convert a UUID to a string of hex digits in standard form\r
35 >>> str(x)\r
36 '00010203-0405-0607-0809-0a0b0c0d0e0f'\r
37\r
38 # get the raw 16 bytes of the UUID\r
39 >>> x.bytes\r
40 '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'\r
41\r
42 # make a UUID from a 16-byte string\r
43 >>> uuid.UUID(bytes=x.bytes)\r
44 UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')\r
45"""\r
46\r
47__author__ = 'Ka-Ping Yee <ping@zesty.ca>'\r
48\r
49RESERVED_NCS, RFC_4122, RESERVED_MICROSOFT, RESERVED_FUTURE = [\r
50 'reserved for NCS compatibility', 'specified in RFC 4122',\r
51 'reserved for Microsoft compatibility', 'reserved for future definition']\r
52\r
53class UUID(object):\r
54 """Instances of the UUID class represent UUIDs as specified in RFC 4122.\r
55 UUID objects are immutable, hashable, and usable as dictionary keys.\r
56 Converting a UUID to a string with str() yields something in the form\r
57 '12345678-1234-1234-1234-123456789abc'. The UUID constructor accepts\r
58 five possible forms: a similar string of hexadecimal digits, or a tuple\r
59 of six integer fields (with 32-bit, 16-bit, 16-bit, 8-bit, 8-bit, and\r
60 48-bit values respectively) as an argument named 'fields', or a string\r
61 of 16 bytes (with all the integer fields in big-endian order) as an\r
62 argument named 'bytes', or a string of 16 bytes (with the first three\r
63 fields in little-endian order) as an argument named 'bytes_le', or a\r
64 single 128-bit integer as an argument named 'int'.\r
65\r
66 UUIDs have these read-only attributes:\r
67\r
68 bytes the UUID as a 16-byte string (containing the six\r
69 integer fields in big-endian byte order)\r
70\r
71 bytes_le the UUID as a 16-byte string (with time_low, time_mid,\r
72 and time_hi_version in little-endian byte order)\r
73\r
74 fields a tuple of the six integer fields of the UUID,\r
75 which are also available as six individual attributes\r
76 and two derived attributes:\r
77\r
78 time_low the first 32 bits of the UUID\r
79 time_mid the next 16 bits of the UUID\r
80 time_hi_version the next 16 bits of the UUID\r
81 clock_seq_hi_variant the next 8 bits of the UUID\r
82 clock_seq_low the next 8 bits of the UUID\r
83 node the last 48 bits of the UUID\r
84\r
85 time the 60-bit timestamp\r
86 clock_seq the 14-bit sequence number\r
87\r
88 hex the UUID as a 32-character hexadecimal string\r
89\r
90 int the UUID as a 128-bit integer\r
91\r
92 urn the UUID as a URN as specified in RFC 4122\r
93\r
94 variant the UUID variant (one of the constants RESERVED_NCS,\r
95 RFC_4122, RESERVED_MICROSOFT, or RESERVED_FUTURE)\r
96\r
97 version the UUID version number (1 through 5, meaningful only\r
98 when the variant is RFC_4122)\r
99 """\r
100\r
101 def __init__(self, hex=None, bytes=None, bytes_le=None, fields=None,\r
102 int=None, version=None):\r
103 r"""Create a UUID from either a string of 32 hexadecimal digits,\r
104 a string of 16 bytes as the 'bytes' argument, a string of 16 bytes\r
105 in little-endian order as the 'bytes_le' argument, a tuple of six\r
106 integers (32-bit time_low, 16-bit time_mid, 16-bit time_hi_version,\r
107 8-bit clock_seq_hi_variant, 8-bit clock_seq_low, 48-bit node) as\r
108 the 'fields' argument, or a single 128-bit integer as the 'int'\r
109 argument. When a string of hex digits is given, curly braces,\r
110 hyphens, and a URN prefix are all optional. For example, these\r
111 expressions all yield the same UUID:\r
112\r
113 UUID('{12345678-1234-5678-1234-567812345678}')\r
114 UUID('12345678123456781234567812345678')\r
115 UUID('urn:uuid:12345678-1234-5678-1234-567812345678')\r
116 UUID(bytes='\x12\x34\x56\x78'*4)\r
117 UUID(bytes_le='\x78\x56\x34\x12\x34\x12\x78\x56' +\r
118 '\x12\x34\x56\x78\x12\x34\x56\x78')\r
119 UUID(fields=(0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x567812345678))\r
120 UUID(int=0x12345678123456781234567812345678)\r
121\r
122 Exactly one of 'hex', 'bytes', 'bytes_le', 'fields', or 'int' must\r
123 be given. The 'version' argument is optional; if given, the resulting\r
124 UUID will have its variant and version set according to RFC 4122,\r
125 overriding the given 'hex', 'bytes', 'bytes_le', 'fields', or 'int'.\r
126 """\r
127\r
128 if [hex, bytes, bytes_le, fields, int].count(None) != 4:\r
129 raise TypeError('need one of hex, bytes, bytes_le, fields, or int')\r
130 if hex is not None:\r
131 hex = hex.replace('urn:', '').replace('uuid:', '')\r
132 hex = hex.strip('{}').replace('-', '')\r
133 if len(hex) != 32:\r
134 raise ValueError('badly formed hexadecimal UUID string')\r
135 int = long(hex, 16)\r
136 if bytes_le is not None:\r
137 if len(bytes_le) != 16:\r
138 raise ValueError('bytes_le is not a 16-char string')\r
139 bytes = (bytes_le[3] + bytes_le[2] + bytes_le[1] + bytes_le[0] +\r
140 bytes_le[5] + bytes_le[4] + bytes_le[7] + bytes_le[6] +\r
141 bytes_le[8:])\r
142 if bytes is not None:\r
143 if len(bytes) != 16:\r
144 raise ValueError('bytes is not a 16-char string')\r
145 int = long(('%02x'*16) % tuple(map(ord, bytes)), 16)\r
146 if fields is not None:\r
147 if len(fields) != 6:\r
148 raise ValueError('fields is not a 6-tuple')\r
149 (time_low, time_mid, time_hi_version,\r
150 clock_seq_hi_variant, clock_seq_low, node) = fields\r
151 if not 0 <= time_low < 1<<32L:\r
152 raise ValueError('field 1 out of range (need a 32-bit value)')\r
153 if not 0 <= time_mid < 1<<16L:\r
154 raise ValueError('field 2 out of range (need a 16-bit value)')\r
155 if not 0 <= time_hi_version < 1<<16L:\r
156 raise ValueError('field 3 out of range (need a 16-bit value)')\r
157 if not 0 <= clock_seq_hi_variant < 1<<8L:\r
158 raise ValueError('field 4 out of range (need an 8-bit value)')\r
159 if not 0 <= clock_seq_low < 1<<8L:\r
160 raise ValueError('field 5 out of range (need an 8-bit value)')\r
161 if not 0 <= node < 1<<48L:\r
162 raise ValueError('field 6 out of range (need a 48-bit value)')\r
163 clock_seq = (clock_seq_hi_variant << 8L) | clock_seq_low\r
164 int = ((time_low << 96L) | (time_mid << 80L) |\r
165 (time_hi_version << 64L) | (clock_seq << 48L) | node)\r
166 if int is not None:\r
167 if not 0 <= int < 1<<128L:\r
168 raise ValueError('int is out of range (need a 128-bit value)')\r
169 if version is not None:\r
170 if not 1 <= version <= 5:\r
171 raise ValueError('illegal version number')\r
172 # Set the variant to RFC 4122.\r
173 int &= ~(0xc000 << 48L)\r
174 int |= 0x8000 << 48L\r
175 # Set the version number.\r
176 int &= ~(0xf000 << 64L)\r
177 int |= version << 76L\r
178 self.__dict__['int'] = int\r
179\r
180 def __cmp__(self, other):\r
181 if isinstance(other, UUID):\r
182 return cmp(self.int, other.int)\r
183 return NotImplemented\r
184\r
185 def __hash__(self):\r
186 return hash(self.int)\r
187\r
188 def __int__(self):\r
189 return self.int\r
190\r
191 def __repr__(self):\r
192 return 'UUID(%r)' % str(self)\r
193\r
194 def __setattr__(self, name, value):\r
195 raise TypeError('UUID objects are immutable')\r
196\r
197 def __str__(self):\r
198 hex = '%032x' % self.int\r
199 return '%s-%s-%s-%s-%s' % (\r
200 hex[:8], hex[8:12], hex[12:16], hex[16:20], hex[20:])\r
201\r
202 def get_bytes(self):\r
203 bytes = ''\r
204 for shift in range(0, 128, 8):\r
205 bytes = chr((self.int >> shift) & 0xff) + bytes\r
206 return bytes\r
207\r
208 bytes = property(get_bytes)\r
209\r
210 def get_bytes_le(self):\r
211 bytes = self.bytes\r
212 return (bytes[3] + bytes[2] + bytes[1] + bytes[0] +\r
213 bytes[5] + bytes[4] + bytes[7] + bytes[6] + bytes[8:])\r
214\r
215 bytes_le = property(get_bytes_le)\r
216\r
217 def get_fields(self):\r
218 return (self.time_low, self.time_mid, self.time_hi_version,\r
219 self.clock_seq_hi_variant, self.clock_seq_low, self.node)\r
220\r
221 fields = property(get_fields)\r
222\r
223 def get_time_low(self):\r
224 return self.int >> 96L\r
225\r
226 time_low = property(get_time_low)\r
227\r
228 def get_time_mid(self):\r
229 return (self.int >> 80L) & 0xffff\r
230\r
231 time_mid = property(get_time_mid)\r
232\r
233 def get_time_hi_version(self):\r
234 return (self.int >> 64L) & 0xffff\r
235\r
236 time_hi_version = property(get_time_hi_version)\r
237\r
238 def get_clock_seq_hi_variant(self):\r
239 return (self.int >> 56L) & 0xff\r
240\r
241 clock_seq_hi_variant = property(get_clock_seq_hi_variant)\r
242\r
243 def get_clock_seq_low(self):\r
244 return (self.int >> 48L) & 0xff\r
245\r
246 clock_seq_low = property(get_clock_seq_low)\r
247\r
248 def get_time(self):\r
249 return (((self.time_hi_version & 0x0fffL) << 48L) |\r
250 (self.time_mid << 32L) | self.time_low)\r
251\r
252 time = property(get_time)\r
253\r
254 def get_clock_seq(self):\r
255 return (((self.clock_seq_hi_variant & 0x3fL) << 8L) |\r
256 self.clock_seq_low)\r
257\r
258 clock_seq = property(get_clock_seq)\r
259\r
260 def get_node(self):\r
261 return self.int & 0xffffffffffff\r
262\r
263 node = property(get_node)\r
264\r
265 def get_hex(self):\r
266 return '%032x' % self.int\r
267\r
268 hex = property(get_hex)\r
269\r
270 def get_urn(self):\r
271 return 'urn:uuid:' + str(self)\r
272\r
273 urn = property(get_urn)\r
274\r
275 def get_variant(self):\r
276 if not self.int & (0x8000 << 48L):\r
277 return RESERVED_NCS\r
278 elif not self.int & (0x4000 << 48L):\r
279 return RFC_4122\r
280 elif not self.int & (0x2000 << 48L):\r
281 return RESERVED_MICROSOFT\r
282 else:\r
283 return RESERVED_FUTURE\r
284\r
285 variant = property(get_variant)\r
286\r
287 def get_version(self):\r
288 # The version bits are only meaningful for RFC 4122 UUIDs.\r
289 if self.variant == RFC_4122:\r
290 return int((self.int >> 76L) & 0xf)\r
291\r
292 version = property(get_version)\r
293\r
294def _find_mac(command, args, hw_identifiers, get_index):\r
295 import os\r
296 for dir in ['', '/sbin/', '/usr/sbin']:\r
297 executable = os.path.join(dir, command)\r
298 if not os.path.exists(executable):\r
299 continue\r
300\r
301 try:\r
302 # LC_ALL to get English output, 2>/dev/null to\r
303 # prevent output on stderr\r
304 cmd = 'LC_ALL=C %s %s 2>/dev/null' % (executable, args)\r
305 with os.popen(cmd) as pipe:\r
306 for line in pipe:\r
307 words = line.lower().split()\r
308 for i in range(len(words)):\r
309 if words[i] in hw_identifiers:\r
310 return int(\r
311 words[get_index(i)].replace(':', ''), 16)\r
312 except IOError:\r
313 continue\r
314 return None\r
315\r
316def _ifconfig_getnode():\r
317 """Get the hardware address on Unix by running ifconfig."""\r
318\r
319 # This works on Linux ('' or '-a'), Tru64 ('-av'), but not all Unixes.\r
320 for args in ('', '-a', '-av'):\r
321 mac = _find_mac('ifconfig', args, ['hwaddr', 'ether'], lambda i: i+1)\r
322 if mac:\r
323 return mac\r
324\r
325 import socket\r
326 ip_addr = socket.gethostbyname(socket.gethostname())\r
327\r
328 # Try getting the MAC addr from arp based on our IP address (Solaris).\r
329 mac = _find_mac('arp', '-an', [ip_addr], lambda i: -1)\r
330 if mac:\r
331 return mac\r
332\r
333 # This might work on HP-UX.\r
334 mac = _find_mac('lanscan', '-ai', ['lan0'], lambda i: 0)\r
335 if mac:\r
336 return mac\r
337\r
338 return None\r
339\r
340def _ipconfig_getnode():\r
341 """Get the hardware address on Windows by running ipconfig.exe."""\r
342 import os, re\r
343 dirs = ['', r'c:\windows\system32', r'c:\winnt\system32']\r
344 try:\r
345 import ctypes\r
346 buffer = ctypes.create_string_buffer(300)\r
347 ctypes.windll.kernel32.GetSystemDirectoryA(buffer, 300)\r
348 dirs.insert(0, buffer.value.decode('mbcs'))\r
349 except:\r
350 pass\r
351 for dir in dirs:\r
352 try:\r
353 pipe = os.popen(os.path.join(dir, 'ipconfig') + ' /all')\r
354 except IOError:\r
355 continue\r
356 else:\r
357 for line in pipe:\r
358 value = line.split(':')[-1].strip().lower()\r
359 if re.match('([0-9a-f][0-9a-f]-){5}[0-9a-f][0-9a-f]', value):\r
360 return int(value.replace('-', ''), 16)\r
361 finally:\r
362 pipe.close()\r
363\r
364def _netbios_getnode():\r
365 """Get the hardware address on Windows using NetBIOS calls.\r
366 See http://support.microsoft.com/kb/118623 for details."""\r
367 import win32wnet, netbios\r
368 ncb = netbios.NCB()\r
369 ncb.Command = netbios.NCBENUM\r
370 ncb.Buffer = adapters = netbios.LANA_ENUM()\r
371 adapters._pack()\r
372 if win32wnet.Netbios(ncb) != 0:\r
373 return\r
374 adapters._unpack()\r
375 for i in range(adapters.length):\r
376 ncb.Reset()\r
377 ncb.Command = netbios.NCBRESET\r
378 ncb.Lana_num = ord(adapters.lana[i])\r
379 if win32wnet.Netbios(ncb) != 0:\r
380 continue\r
381 ncb.Reset()\r
382 ncb.Command = netbios.NCBASTAT\r
383 ncb.Lana_num = ord(adapters.lana[i])\r
384 ncb.Callname = '*'.ljust(16)\r
385 ncb.Buffer = status = netbios.ADAPTER_STATUS()\r
386 if win32wnet.Netbios(ncb) != 0:\r
387 continue\r
388 status._unpack()\r
389 bytes = map(ord, status.adapter_address)\r
390 return ((bytes[0]<<40L) + (bytes[1]<<32L) + (bytes[2]<<24L) +\r
391 (bytes[3]<<16L) + (bytes[4]<<8L) + bytes[5])\r
392\r
393# Thanks to Thomas Heller for ctypes and for his help with its use here.\r
394\r
395# If ctypes is available, use it to find system routines for UUID generation.\r
396_uuid_generate_random = _uuid_generate_time = _UuidCreate = None\r
397try:\r
398 import ctypes, ctypes.util\r
399\r
400 # The uuid_generate_* routines are provided by libuuid on at least\r
401 # Linux and FreeBSD, and provided by libc on Mac OS X.\r
402 for libname in ['uuid', 'c']:\r
403 try:\r
404 lib = ctypes.CDLL(ctypes.util.find_library(libname))\r
405 except:\r
406 continue\r
407 if hasattr(lib, 'uuid_generate_random'):\r
408 _uuid_generate_random = lib.uuid_generate_random\r
409 if hasattr(lib, 'uuid_generate_time'):\r
410 _uuid_generate_time = lib.uuid_generate_time\r
411\r
412 # The uuid_generate_* functions are broken on MacOS X 10.5, as noted\r
413 # in issue #8621 the function generates the same sequence of values\r
414 # in the parent process and all children created using fork (unless\r
415 # those children use exec as well).\r
416 #\r
417 # Assume that the uuid_generate functions are broken from 10.5 onward,\r
418 # the test can be adjusted when a later version is fixed.\r
419 import sys\r
420 if sys.platform == 'darwin':\r
421 import os\r
422 if int(os.uname()[2].split('.')[0]) >= 9:\r
423 _uuid_generate_random = _uuid_generate_time = None\r
424\r
425 # On Windows prior to 2000, UuidCreate gives a UUID containing the\r
426 # hardware address. On Windows 2000 and later, UuidCreate makes a\r
427 # random UUID and UuidCreateSequential gives a UUID containing the\r
428 # hardware address. These routines are provided by the RPC runtime.\r
429 # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last\r
430 # 6 bytes returned by UuidCreateSequential are fixed, they don't appear\r
431 # to bear any relationship to the MAC address of any network device\r
432 # on the box.\r
433 try:\r
434 lib = ctypes.windll.rpcrt4\r
435 except:\r
436 lib = None\r
437 _UuidCreate = getattr(lib, 'UuidCreateSequential',\r
438 getattr(lib, 'UuidCreate', None))\r
439except:\r
440 pass\r
441\r
442def _unixdll_getnode():\r
443 """Get the hardware address on Unix using ctypes."""\r
444 _buffer = ctypes.create_string_buffer(16)\r
445 _uuid_generate_time(_buffer)\r
446 return UUID(bytes=_buffer.raw).node\r
447\r
448def _windll_getnode():\r
449 """Get the hardware address on Windows using ctypes."""\r
450 _buffer = ctypes.create_string_buffer(16)\r
451 if _UuidCreate(_buffer) == 0:\r
452 return UUID(bytes=_buffer.raw).node\r
453\r
454def _random_getnode():\r
455 """Get a random node ID, with eighth bit set as suggested by RFC 4122."""\r
456 import random\r
457 return random.randrange(0, 1<<48L) | 0x010000000000L\r
458\r
459_node = None\r
460\r
461def getnode():\r
462 """Get the hardware address as a 48-bit positive integer.\r
463\r
464 The first time this runs, it may launch a separate program, which could\r
465 be quite slow. If all attempts to obtain the hardware address fail, we\r
466 choose a random 48-bit number with its eighth bit set to 1 as recommended\r
467 in RFC 4122.\r
468 """\r
469\r
470 global _node\r
471 if _node is not None:\r
472 return _node\r
473\r
474 import sys\r
475 if sys.platform == 'win32':\r
476 getters = [_windll_getnode, _netbios_getnode, _ipconfig_getnode]\r
477 else:\r
478 getters = [_unixdll_getnode, _ifconfig_getnode]\r
479\r
480 for getter in getters + [_random_getnode]:\r
481 try:\r
482 _node = getter()\r
483 except:\r
484 continue\r
485 if _node is not None:\r
486 return _node\r
487\r
488_last_timestamp = None\r
489\r
490def uuid1(node=None, clock_seq=None):\r
491 """Generate a UUID from a host ID, sequence number, and the current time.\r
492 If 'node' is not given, getnode() is used to obtain the hardware\r
493 address. If 'clock_seq' is given, it is used as the sequence number;\r
494 otherwise a random 14-bit sequence number is chosen."""\r
495\r
496 # When the system provides a version-1 UUID generator, use it (but don't\r
497 # use UuidCreate here because its UUIDs don't conform to RFC 4122).\r
498 if _uuid_generate_time and node is clock_seq is None:\r
499 _buffer = ctypes.create_string_buffer(16)\r
500 _uuid_generate_time(_buffer)\r
501 return UUID(bytes=_buffer.raw)\r
502\r
503 global _last_timestamp\r
504 import time\r
505 nanoseconds = int(time.time() * 1e9)\r
506 # 0x01b21dd213814000 is the number of 100-ns intervals between the\r
507 # UUID epoch 1582-10-15 00:00:00 and the Unix epoch 1970-01-01 00:00:00.\r
508 timestamp = int(nanoseconds//100) + 0x01b21dd213814000L\r
509 if _last_timestamp is not None and timestamp <= _last_timestamp:\r
510 timestamp = _last_timestamp + 1\r
511 _last_timestamp = timestamp\r
512 if clock_seq is None:\r
513 import random\r
514 clock_seq = random.randrange(1<<14L) # instead of stable storage\r
515 time_low = timestamp & 0xffffffffL\r
516 time_mid = (timestamp >> 32L) & 0xffffL\r
517 time_hi_version = (timestamp >> 48L) & 0x0fffL\r
518 clock_seq_low = clock_seq & 0xffL\r
519 clock_seq_hi_variant = (clock_seq >> 8L) & 0x3fL\r
520 if node is None:\r
521 node = getnode()\r
522 return UUID(fields=(time_low, time_mid, time_hi_version,\r
523 clock_seq_hi_variant, clock_seq_low, node), version=1)\r
524\r
525def uuid3(namespace, name):\r
526 """Generate a UUID from the MD5 hash of a namespace UUID and a name."""\r
527 from hashlib import md5\r
528 hash = md5(namespace.bytes + name).digest()\r
529 return UUID(bytes=hash[:16], version=3)\r
530\r
531def uuid4():\r
532 """Generate a random UUID."""\r
533\r
534 # When the system provides a version-4 UUID generator, use it.\r
535 if _uuid_generate_random:\r
536 _buffer = ctypes.create_string_buffer(16)\r
537 _uuid_generate_random(_buffer)\r
538 return UUID(bytes=_buffer.raw)\r
539\r
540 # Otherwise, get randomness from urandom or the 'random' module.\r
541 try:\r
542 import os\r
543 return UUID(bytes=os.urandom(16), version=4)\r
544 except:\r
545 import random\r
546 bytes = [chr(random.randrange(256)) for i in range(16)]\r
547 return UUID(bytes=bytes, version=4)\r
548\r
549def uuid5(namespace, name):\r
550 """Generate a UUID from the SHA-1 hash of a namespace UUID and a name."""\r
551 from hashlib import sha1\r
552 hash = sha1(namespace.bytes + name).digest()\r
553 return UUID(bytes=hash[:16], version=5)\r
554\r
555# The following standard UUIDs are for use with uuid3() or uuid5().\r
556\r
557NAMESPACE_DNS = UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8')\r
558NAMESPACE_URL = UUID('6ba7b811-9dad-11d1-80b4-00c04fd430c8')\r
559NAMESPACE_OID = UUID('6ba7b812-9dad-11d1-80b4-00c04fd430c8')\r
560NAMESPACE_X500 = UUID('6ba7b814-9dad-11d1-80b4-00c04fd430c8')\r