| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  | ! Copyright (C) 2008 John Benediktsson | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license | 
					
						
							| 
									
										
										
										
											2010-06-22 03:00:19 -04:00
										 |  |  | USING: byte-arrays calendar checksums checksums.md5 | 
					
						
							|  |  |  | checksums.sha io.binary kernel math math.parser math.ranges | 
					
						
							|  |  |  | random sequences strings system unicode.case ;
 | 
					
						
							|  |  |  | IN: uuid | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  | : (timestamp) ( -- time_high time_mid time_low )
 | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  |     ! 0x01b21dd213814000L is the number of 100-ns intervals | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  |     ! between the UUID epoch 1582-10-15 00:00:00 and the | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  |     ! Unix epoch 1970-01-01 00:00:00. | 
					
						
							| 
									
										
										
										
											2011-11-23 21:49:33 -05:00
										 |  |  |     gmt timestamp>micros 10 * 0x01b21dd213814000 +
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  |     [ -48 shift 0x0fff bitand ] | 
					
						
							| 
									
										
										
										
											2011-11-23 21:49:33 -05:00
										 |  |  |     [ -32 shift 0xffff bitand ] | 
					
						
							|  |  |  |     [ 0xffffffff bitand ] | 
					
						
							| 
									
										
										
										
											2008-12-22 02:22:05 -05:00
										 |  |  |     tri ;
 | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  | : (hardware) ( -- address )
 | 
					
						
							|  |  |  |     ! Choose a random 48-bit number with eighth bit | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  |     ! set to 1 (as recommended in RFC 4122) | 
					
						
							| 
									
										
										
										
											2011-11-23 21:49:33 -05:00
										 |  |  |     48 random-bits 0x010000000000 bitor ;
 | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  | : (clock) ( -- clockseq )
 | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  |     ! Choose a random 14-bit number | 
					
						
							|  |  |  |     14 random-bits ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <uuid> ( address clockseq time_high time_mid time_low -- n )
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  |     96 shift
 | 
					
						
							|  |  |  |     [ 80 shift ] dip bitor
 | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  |     [ 64 shift ] dip bitor
 | 
					
						
							|  |  |  |     [ 48 shift ] dip bitor
 | 
					
						
							|  |  |  |     bitor ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (version) ( n version -- n' )
 | 
					
						
							| 
									
										
										
										
											2008-12-22 02:22:05 -05:00
										 |  |  |     [ | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  |         0xc000 48 shift bitnot bitand
 | 
					
						
							|  |  |  |         0x8000 48 shift bitor
 | 
					
						
							| 
									
										
										
										
											2011-11-23 21:49:33 -05:00
										 |  |  |         0xf000 64 shift bitnot bitand
 | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  |     ] dip 76 shift bitor ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : uuid>string ( n -- string )
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  |     >hex 32 CHAR: 0 pad-head
 | 
					
						
							| 
									
										
										
										
											2008-12-20 21:38:35 -05:00
										 |  |  |     [ CHAR: - 20 ] dip insert-nth
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  |     [ CHAR: - 16 ] dip insert-nth
 | 
					
						
							|  |  |  |     [ CHAR: - 12 ] dip insert-nth
 | 
					
						
							| 
									
										
										
										
											2008-12-20 21:38:35 -05:00
										 |  |  |     [ CHAR: - 8 ] dip insert-nth ;
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  | : string>uuid ( string -- n )
 | 
					
						
							| 
									
										
										
										
											2015-05-12 21:50:34 -04:00
										 |  |  |     [ CHAR: - = ] reject hex> ;
 | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  | : uuid-parse ( string -- byte-array )
 | 
					
						
							| 
									
										
										
										
											2008-12-22 09:42:08 -05:00
										 |  |  |     string>uuid 16 >be ;
 | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  | : uuid-unparse ( byte-array -- string )
 | 
					
						
							| 
									
										
										
										
											2008-12-22 02:22:05 -05:00
										 |  |  |     be> uuid>string ;
 | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : uuid1 ( -- string )
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  |     (hardware) (clock) (timestamp) <uuid> | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  |     1 (version) uuid>string ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : uuid3 ( namespace name -- string )
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  |     [ uuid-parse ] dip append
 | 
					
						
							|  |  |  |     md5 checksum-bytes 16 short head be> | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  |     3 (version) uuid>string ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : uuid4 ( -- string )
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  |     128 random-bits | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  |     4 (version) uuid>string ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : uuid5 ( namespace name -- string )
 | 
					
						
							| 
									
										
										
										
											2013-03-06 12:20:59 -05:00
										 |  |  |     [ uuid-parse ] dip append
 | 
					
						
							|  |  |  |     sha1 checksum-bytes 16 short head be> | 
					
						
							| 
									
										
										
										
											2008-12-20 01:22:58 -05:00
										 |  |  |     5 (version) uuid>string ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 02:22:05 -05:00
										 |  |  | CONSTANT: NAMESPACE_DNS  "6ba7b810-9dad-11d1-80b4-00c04fd430c8" | 
					
						
							|  |  |  | CONSTANT: NAMESPACE_URL  "6ba7b811-9dad-11d1-80b4-00c04fd430c8" | 
					
						
							|  |  |  | CONSTANT: NAMESPACE_OID  "6ba7b812-9dad-11d1-80b4-00c04fd430c8" | 
					
						
							|  |  |  | CONSTANT: NAMESPACE_X500 "6ba7b814-9dad-11d1-80b4-00c04fd430c8" |