xref: /aoo4110/main/sal/inc/rtl/uuid.h (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski #ifndef _RTL_UUID_H_
24*b1cdbd2cSJim Jagielski #define _RTL_UUID_H_
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <sal/types.h>
28*b1cdbd2cSJim Jagielski #include <rtl/string.h>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski /**
31*b1cdbd2cSJim Jagielski    @HTML
32*b1cdbd2cSJim Jagielski    @file
33*b1cdbd2cSJim Jagielski    Specification (from draft-leach-uuids-guids-01.txt )
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski    <p>
36*b1cdbd2cSJim Jagielski    A UUID is an identifier that is unique across both space and time,
37*b1cdbd2cSJim Jagielski    with respect to the space of all UUIDs. To be precise, the UUID
38*b1cdbd2cSJim Jagielski    consists of a finite bit space. Thus, collision cannot be avoided in
39*b1cdbd2cSJim Jagielski    principle. A UUID can be used for multiple purposes, from tagging objects
40*b1cdbd2cSJim Jagielski    with an extremely short lifetime, to reliably identifying very persistent
41*b1cdbd2cSJim Jagielski    objects across a network.
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski    <p>
44*b1cdbd2cSJim Jagielski 	The generation of UUIDs does not require that a registration
45*b1cdbd2cSJim Jagielski 	authority be contacted for each identifier. Instead, Version 4 UUIDs are
46*b1cdbd2cSJim Jagielski     generated from (pseudo unique) sequences of (pseudo) random bits.
47*b1cdbd2cSJim Jagielski  */
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski #ifdef __cplusplus
50*b1cdbd2cSJim Jagielski extern "C" {
51*b1cdbd2cSJim Jagielski #endif
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski /** Generates a new Version 4 (random number based) UUID (Universally Unique
54*b1cdbd2cSJim Jagielski     IDentifier).
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski 	@param pTargetUUID          pointer to at least 16 bytes of memory. After the call it contains
57*b1cdbd2cSJim Jagielski 	                            the newly generated uuid in network byte order.
58*b1cdbd2cSJim Jagielski 	@param pPredecessorUUID     ignored (was used when this function returned
59*b1cdbd2cSJim Jagielski                                 Version 1 instead of Version 4 UUIDs).
60*b1cdbd2cSJim Jagielski 	@param bUseEthernetAddress  ignored (was used when this function returned
61*b1cdbd2cSJim Jagielski                                 Version 1 instead of Version 4 UUIDs).
62*b1cdbd2cSJim Jagielski  */
63*b1cdbd2cSJim Jagielski void SAL_CALL rtl_createUuid( sal_uInt8 *pTargetUUID ,
64*b1cdbd2cSJim Jagielski 							  const sal_uInt8 *pPredecessorUUID,
65*b1cdbd2cSJim Jagielski 							  sal_Bool bUseEthernetAddress );
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski /** Compare two UUID's lexically
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski 	<p>
70*b1cdbd2cSJim Jagielski 	Note:   lexical ordering is not temporal ordering!
71*b1cdbd2cSJim Jagielski 	<p>
72*b1cdbd2cSJim Jagielski 	Note:   For equalnesschecking, a memcmp(pUUID1,pUUID2,16) is more efficient
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski 	@return
75*b1cdbd2cSJim Jagielski 	<ul>
76*b1cdbd2cSJim Jagielski 	<li>-1   u1 is lexically before u2
77*b1cdbd2cSJim Jagielski 	<li>0   u1 is equal to u2
78*b1cdbd2cSJim Jagielski 	<li>1   u1 is lexically after u2
79*b1cdbd2cSJim Jagielski 	</ul>
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski  */
82*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL rtl_compareUuid( const sal_uInt8 *pUUID1 , const sal_uInt8 *pUUID2 );
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski /** Creates named UUIDs.
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski 	<p>
87*b1cdbd2cSJim Jagielski 	The version 3 UUID is meant for generating UUIDs from <em>names</em> that
88*b1cdbd2cSJim Jagielski 	are drawn from, and unique within, some <em>name space</em>. Some examples
89*b1cdbd2cSJim Jagielski 	of names (and, implicitly, name spaces) might be DNS names, URLs, ISO
90*b1cdbd2cSJim Jagielski 	Object IDs (OIDs), reserved words in a programming language, or X.500
91*b1cdbd2cSJim Jagielski 	Distinguished Names (DNs); thus, the concept of name and name space
92*b1cdbd2cSJim Jagielski 	should be broadly construed, and not limited to textual names.
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski 	<p>
95*b1cdbd2cSJim Jagielski 	The requirements for such UUIDs are as follows:
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski 	<ul>
98*b1cdbd2cSJim Jagielski 	<li> The UUIDs generated at different times from the same name in the
99*b1cdbd2cSJim Jagielski          same namespace MUST be equal
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 	<li> The UUIDs generated from two different names in the same namespace
102*b1cdbd2cSJim Jagielski 	     should be different (with very high probability)
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski 	<li> The UUIDs generated from the same name in two different namespaces
105*b1cdbd2cSJim Jagielski 	     should be different with (very high probability)
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski 	<li> If two UUIDs that were generated from names are equal, then they
108*b1cdbd2cSJim Jagielski 	     were generated from the same name in the same namespace (with very
109*b1cdbd2cSJim Jagielski 	     high probability).
110*b1cdbd2cSJim Jagielski 	</ul>
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 	@param pTargetUUID pointer to at least 16 bytes of memory. After the call
113*b1cdbd2cSJim Jagielski 	                   it contains the newly generated uuid in network byte order.
114*b1cdbd2cSJim Jagielski 	@param pNameSpaceUUID The namespace uuid. Below are some predefined ones,
115*b1cdbd2cSJim Jagielski 	                      but any arbitray uuid can be used as namespace.
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 	@param pName the name
118*b1cdbd2cSJim Jagielski  */
119*b1cdbd2cSJim Jagielski void SAL_CALL rtl_createNamedUuid(
120*b1cdbd2cSJim Jagielski 	sal_uInt8  *pTargetUUID,
121*b1cdbd2cSJim Jagielski 	const sal_uInt8  *pNameSpaceUUID,
122*b1cdbd2cSJim Jagielski 	const rtl_String *pName
123*b1cdbd2cSJim Jagielski 	);
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski /*
128*b1cdbd2cSJim Jagielski 	Predefined Namespaces
129*b1cdbd2cSJim Jagielski 	(Use them the following way : sal_uInt8 aNsDNS[16])  = RTL_UUID_NAMESPACE_DNS;
130*b1cdbd2cSJim Jagielski  */
131*b1cdbd2cSJim Jagielski /** namesapce DNS
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 	<p>
134*b1cdbd2cSJim Jagielski 	(Use them the following way : sal_uInt8 aNsDNS[16])  = RTL_UUID_NAMESPACE_DNS;
135*b1cdbd2cSJim Jagielski 	<p>
136*b1cdbd2cSJim Jagielski    6ba7b810-9dad-11d1-80b4-00c04fd430c8 */
137*b1cdbd2cSJim Jagielski #define RTL_UUID_NAMESPACE_DNS {\
138*b1cdbd2cSJim Jagielski       0x6b,0xa7,0xb8,0x10,\
139*b1cdbd2cSJim Jagielski       0x9d,0xad,\
140*b1cdbd2cSJim Jagielski       0x11,0xd1,\
141*b1cdbd2cSJim Jagielski       0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8\
142*b1cdbd2cSJim Jagielski     }
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski /** namespace URL
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski    <p>
147*b1cdbd2cSJim Jagielski    6ba7b811-9dad-11d1-80b4-00c04fd430c8 */
148*b1cdbd2cSJim Jagielski #define RTL_UUID_NAMESPACE_URL { \
149*b1cdbd2cSJim Jagielski       0x6b, 0xa7, 0xb8, 0x11,\
150*b1cdbd2cSJim Jagielski       0x9d, 0xad,\
151*b1cdbd2cSJim Jagielski       0x11, 0xd1,\
152*b1cdbd2cSJim Jagielski       0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8\
153*b1cdbd2cSJim Jagielski     }
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski /** namespace oid
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 	<p>
158*b1cdbd2cSJim Jagielski 	6ba7b812-9dad-11d1-80b4-00c04fd430c8 */
159*b1cdbd2cSJim Jagielski #define RTL_UUID_NAMESPACE_OID {\
160*b1cdbd2cSJim Jagielski       0x6b, 0xa7, 0xb8, 0x12,\
161*b1cdbd2cSJim Jagielski       0x9d, 0xad,\
162*b1cdbd2cSJim Jagielski       0x11, 0xd1,\
163*b1cdbd2cSJim Jagielski       0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8\
164*b1cdbd2cSJim Jagielski     }
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski /** namespace X500
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski 	<p>
169*b1cdbd2cSJim Jagielski 	6ba7b814-9dad-11d1-80b4-00c04fd430c8 */
170*b1cdbd2cSJim Jagielski #define RTL_UUID_NAMESPACE_X500 {\
171*b1cdbd2cSJim Jagielski       0x6b, 0xa7, 0xb8, 0x14,\
172*b1cdbd2cSJim Jagielski       0x9d, 0xad,\
173*b1cdbd2cSJim Jagielski       0x11, 0xd1,\
174*b1cdbd2cSJim Jagielski       0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8\
175*b1cdbd2cSJim Jagielski     }
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski /*
179*b1cdbd2cSJim Jagielski 	This macro must have a value below the system time resolution of the
180*b1cdbd2cSJim Jagielski 	system. The uuid routines use this value  as an upper limit for adding ticks to the
181*b1cdbd2cSJim Jagielski 	the predecessor time value if system times are equal.
182*b1cdbd2cSJim Jagielski  */
183*b1cdbd2cSJim Jagielski #ifdef SAL_W32
184*b1cdbd2cSJim Jagielski #define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 1000
185*b1cdbd2cSJim Jagielski #elif defined SAL_OS2 // YD we use posix functions for time
186*b1cdbd2cSJim Jagielski #define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
187*b1cdbd2cSJim Jagielski #elif LINUX
188*b1cdbd2cSJim Jagielski #define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
189*b1cdbd2cSJim Jagielski #elif NETBSD
190*b1cdbd2cSJim Jagielski #define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
191*b1cdbd2cSJim Jagielski #elif FREEBSD
192*b1cdbd2cSJim Jagielski #define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
193*b1cdbd2cSJim Jagielski #elif SOLARIS
194*b1cdbd2cSJim Jagielski #define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
195*b1cdbd2cSJim Jagielski #elif MACOSX
196*b1cdbd2cSJim Jagielski #define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 100000
197*b1cdbd2cSJim Jagielski #else
198*b1cdbd2cSJim Jagielski #error "System time resolution must be calculated!"
199*b1cdbd2cSJim Jagielski #endif
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski #ifdef __cplusplus
202*b1cdbd2cSJim Jagielski }
203*b1cdbd2cSJim Jagielski #endif
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski #endif
206