Subversion Repositories uuid_mac_utils

Rev

Rev 76 | Rev 83 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
31 daniel-mar 1
<?php
2 daniel-mar 2
 
31 daniel-mar 3
/*
4
* UUID & MAC Utils
82 daniel-mar 5
* Copyright 2017 - 2024 Daniel Marschall, ViaThinkSoft
6
* Version 2024-03-09
31 daniel-mar 7
*
8
* Licensed under the Apache License, Version 2.0 (the "License");
9
* you may not use this file except in compliance with the License.
10
* You may obtain a copy of the License at
11
*
12
*     http://www.apache.org/licenses/LICENSE-2.0
13
*
14
* Unless required by applicable law or agreed to in writing, software
15
* distributed under the License is distributed on an "AS IS" BASIS,
16
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
* See the License for the specific language governing permissions and
18
* limitations under the License.
19
*/
20
 
21
include_once __DIR__.'/includes/uuid_utils.inc.php';
22
 
72 daniel-mar 23
const AUTO_NEW_UUIDS = 15;
31 daniel-mar 24
 
25
?><!DOCTYPE html>
26
<html lang="en">
27
 
2 daniel-mar 28
<head>
29
        <meta charset="iso-8859-1">
30
        <link rel="stylesheet" type="text/css" href="style.css">
31
        <title>UUID &amp; MAC Utils by Daniel Marschall</title>
35 daniel-mar 32
        <meta name=viewport content="width=device-width, initial-scale=1">
2 daniel-mar 33
</head>
34
 
35
<body>
36
 
25 daniel-mar 37
<h1>UUID &amp; MAC Utils by Daniel Marschall</h1>
2 daniel-mar 38
 
12 daniel-mar 39
<p><a href="https://github.com/danielmarschall/uuid_mac_utils/">View the source code</a></p>
2 daniel-mar 40
 
31 daniel-mar 41
<h2>Overview</h2>
2 daniel-mar 42
 
31 daniel-mar 43
<ul>
44
    <li><a href="#gen_uuid">Generate random and/or time-based UUIDs</a><ul>
75 daniel-mar 45
            <li><a href="#gen_uuidv7"><font color="green">New:</font> Generate Unix Epoch time-based (version 7) UUID</a></li>
46
            <li><a href="#gen_uuidv6"><font color="green">New:</font> Generate reordered Gregorian time-based (version 6) UUID</a></li>
31 daniel-mar 47
            <li><a href="#gen_uuidv4">Generate random (version 4) UUID</a></li>
75 daniel-mar 48
            <li><a href="#gen_uuidv1">Generate Gregorian time-based (version 1) UUID</a></li>
82 daniel-mar 49
            <li><a href="#gen_uuidv8_sqlserver"><font color="green">New:</font> Generate SQL server sortable time-based (version 8) UUID</a></li>
31 daniel-mar 50
        </ul></li>
51
    <li><a href="#gen_other_uuid">Generate other UUID types</a><ul>
53 daniel-mar 52
            <li><a href="#gen_uuid_ncs">NCS (variant 0) UUID</a></li>
31 daniel-mar 53
            <li><a href="#gen_uuidv2">Generate DCE Security (version 2) UUID</a></li>
61 daniel-mar 54
            <li><a href="#gen_uuidv35">Generate name-based (version 3 / 5 / <font color="green">New: 8</font>) UUID</a></li>
55
            <li><a href="#gen_uuidv8"><font color="green">New:</font> Generate Custom (version 8) UUID</a></li>
31 daniel-mar 56
        </ul></li>
57
    <li><a href="#interpret_uuid">Interpret a UUID</a></li>
41 daniel-mar 58
    <li><a href="#interpret_mac">Interpret a MAC address (MAC / EUI / ELI / SAI / AAI)</a><ul>
59
        <li><a href="#gen_aai">Generate an AAI</a></li>
60
    </ul></li>
31 daniel-mar 61
</ul>
2 daniel-mar 62
 
31 daniel-mar 63
<h2 id="gen_uuid">Generate random and/or time-based UUIDs</h2>
30 daniel-mar 64
 
75 daniel-mar 65
<h3 id="gen_uuidv7"><font color="green">New:</font> Generate Unix Epoch time-based (version 7) UUID &#11088;</h3>
31 daniel-mar 66
 
72 daniel-mar 67
<p><i>A UUIDv7 measures time in the Unix Epoch with an accuracy
68
between 1ms and 245ns, depending on how many bits are spent for the timestamp (48-60 bits).
69
The rest of the UUID (62-74 bits) is filled with random data.
70
The timestamp is at the front of the UUID, therefore the UUIDs are monotonically increasing,
75 daniel-mar 71
which is good for using them in database indexes.
72
Since this UUID version does not contain a MAC address, it is also
72 daniel-mar 73
recommended due to the improved privacy.</i></p>
31 daniel-mar 74
 
35 daniel-mar 75
<script>
76
function show_uuidv7_info() {
77
        document.getElementById("uuidv7_info_button").style.display = "none";
78
        document.getElementById("uuidv7_info").style.display = "block";
79
}
80
</script>
62 daniel-mar 81
<p><a id="uuidv7_info_button" href="javascript:show_uuidv7_info()">Show format</a>
35 daniel-mar 82
<pre id="uuidv7_info" style="display:none">Variant 1, Version 7 UUID:
37 daniel-mar 83
- 48 bit <abbr title="Count of 1ms intervals passed since 1 Jan 1970 00:00:00 GMT">Unix Time in milliseconds</abbr>
35 daniel-mar 84
-  4 bit Version (fix 0x7)
70 daniel-mar 85
- 12 bit Data
35 daniel-mar 86
-  2 bit Variant (fix 0b10)
70 daniel-mar 87
- 62 bit Data
35 daniel-mar 88
 
70 daniel-mar 89
Structure of data (74 bits):
90
- OPTIONAL : Sub-millisecond timestamp fraction (0-12 bits)
91
- OPTIONAL : Carefully seeded counter
92
- Random generated bits for any remaining space
93
 
94
Time resolution for various sub-millisecond bits:
31 daniel-mar 95
<?php
70 daniel-mar 96
for ($num_ms_frac_bits=0; $num_ms_frac_bits<=12; $num_ms_frac_bits++) {
97
        $resolution_ns = 1000000 / pow(2,$num_ms_frac_bits);
98
        if ($resolution_ns >= 1000000) $resolution_ns_hf = ($resolution_ns/1000000)." ms";
99
        else if ($resolution_ns >= 1000) $resolution_ns_hf = ($resolution_ns/1000)." &micro;s";
100
        else $resolution_ns_hf = "$resolution_ns ns";
101
        echo "$num_ms_frac_bits bits fraction = $resolution_ns_hf\n";
102
}
103
?>
72 daniel-mar 104
 
105
This implementation outputs:
106
- 12 bits sub-millisecond timestamp (~245ns resolution)
107
- no counter
108
- 62 bits random data
70 daniel-mar 109
</pre></p>
110
 
111
<?php
31 daniel-mar 112
if (AUTO_NEW_UUIDS > 0) { /** @phpstan-ignore-line */
35 daniel-mar 113
        echo '<p>Here are '.AUTO_NEW_UUIDS.' UUIDs that were created just for you! (Reload the page to get more)</p>';
31 daniel-mar 114
 
115
        echo '<pre>';
70 daniel-mar 116
        for ($i=0; $i<AUTO_NEW_UUIDS; $i++) {
31 daniel-mar 117
                $uuid = gen_uuid_v7();
118
                echo '<a href="interprete_uuid.php?uuid='.$uuid.'">'.$uuid.'</a><br>';
119
        }
120
        echo '</pre>';
121
}
122
?>
123
 
2 daniel-mar 124
<form method="GET" action="interprete_uuid.php">
31 daniel-mar 125
    <input type="hidden" name="version" value="7">
126
    <input type="hidden" name="uuid" value="CREATE"> <input type="submit" value="Create and display another UUID">
2 daniel-mar 127
</form>
128
 
75 daniel-mar 129
<h3 id="gen_uuidv6"><font color="green">New:</font> Generate reordered Gregorian time-based (version 6) UUID &#9200;</h3>
2 daniel-mar 130
 
31 daniel-mar 131
<p><i>Like UUIDv1, this kind of UUID is made of the MAC address of the generating computer,
132
        the time, and a clock sequence. However, the components in UUIDv6 are reordered (time is at the beginning),
75 daniel-mar 133
        so that UUIDs are monotonically increasing, which is good for using them in database indexes.</i></p>
2 daniel-mar 134
 
35 daniel-mar 135
<script>
136
function show_uuidv6_info() {
137
        document.getElementById("uuidv6_info_button").style.display = "none";
138
        document.getElementById("uuidv6_info").style.display = "block";
139
}
140
</script>
62 daniel-mar 141
<p><a id="uuidv6_info_button" href="javascript:show_uuidv6_info()">Show format</a>
35 daniel-mar 142
<pre id="uuidv6_info" style="display:none">Variant 1, Version 6 UUID:
37 daniel-mar 143
- 48 bit High <abbr title="Count of 100ns intervals passed since 15 Oct 1582 00:00:00 GMT">Time</abbr>
35 daniel-mar 144
-  4 bit Version (fix 0x6)
37 daniel-mar 145
- 12 bit Low <abbr title="Count of 100ns intervals passed since 15 Oct 1582 00:00:00 GMT">Time</abbr>
35 daniel-mar 146
-  2 bit Variant (fix 0b10)
147
-  6 bit Clock Sequence High
148
-  8 bit Clock Sequence Low
149
- 48 bit MAC Address</pre></p>
150
 
31 daniel-mar 151
<?php
152
if (AUTO_NEW_UUIDS > 0) { /** @phpstan-ignore-line */
35 daniel-mar 153
        echo '<p>Here are '.AUTO_NEW_UUIDS.' UUIDs that were created just for you! (Reload the page to get more)</p>';
31 daniel-mar 154
 
155
        echo '<pre>';
70 daniel-mar 156
        for ($i=0; $i<AUTO_NEW_UUIDS; $i++) {
31 daniel-mar 157
                $uuid = gen_uuid_v6();
158
                echo '<a href="interprete_uuid.php?uuid='.$uuid.'">'.$uuid.'</a><br>';
159
        }
160
        echo '</pre>';
161
}
162
?>
163
 
2 daniel-mar 164
<form method="GET" action="interprete_uuid.php">
31 daniel-mar 165
    <input type="hidden" name="version" value="6">
166
    <input type="hidden" name="uuid" value="CREATE"> <input type="submit" value="Create and display another UUID">
30 daniel-mar 167
</form>
168
 
31 daniel-mar 169
<h3 id="gen_uuidv4">Generate random (version 4) UUID &#x1F3B2;</h3>
30 daniel-mar 170
 
35 daniel-mar 171
<p><i>A UUIDv4 is made of 122 random&nbsp;bits. No other information is encoded in this kind of UUID.</i></p>
30 daniel-mar 172
 
35 daniel-mar 173
<script>
174
function show_uuidv4_info() {
175
        document.getElementById("uuidv4_info_button").style.display = "none";
176
        document.getElementById("uuidv4_info").style.display = "block";
177
}
178
</script>
62 daniel-mar 179
<p><a id="uuidv4_info_button" href="javascript:show_uuidv4_info()">Show format</a>
35 daniel-mar 180
<pre id="uuidv4_info" style="display:none">Variant 1, Version 4 UUID:
181
- 48 bit Random High
182
-  4 bit Version (fix 0x4)
183
- 12 bit Random Mid
184
-  2 bit Variant (fix 0b10)
185
- 62 bit Random Low</pre></p>
186
 
31 daniel-mar 187
<?php
188
if (AUTO_NEW_UUIDS > 0) { /** @phpstan-ignore-line */
35 daniel-mar 189
        echo '<p>Here are '.AUTO_NEW_UUIDS.' UUIDs that were created just for you! (Reload the page to get more)</p>';
31 daniel-mar 190
 
191
        echo '<pre>';
70 daniel-mar 192
        for ($i=0; $i<AUTO_NEW_UUIDS; $i++) {
31 daniel-mar 193
                $uuid = gen_uuid_v4();
194
                echo '<a href="interprete_uuid.php?uuid='.$uuid.'">'.$uuid.'</a><br>';
195
        }
196
        echo '</pre>';
197
}
198
?>
199
 
30 daniel-mar 200
<form method="GET" action="interprete_uuid.php">
31 daniel-mar 201
    <input type="hidden" name="version" value="4">
202
    <input type="hidden" name="uuid" value="CREATE"> <input type="submit" value="Create and display another UUID">
30 daniel-mar 203
</form>
204
 
75 daniel-mar 205
<h3 id="gen_uuidv1">Generate Gregorian time-based (version 1) UUID &#9200;</h3>
30 daniel-mar 206
 
31 daniel-mar 207
<p><i>A UUIDv1 is made of the MAC address of the generating computer,
208
the time, and a clock sequence.</i></p>
30 daniel-mar 209
 
35 daniel-mar 210
<script>
211
function show_uuidv1_info() {
212
        document.getElementById("uuidv1_info_button").style.display = "none";
213
        document.getElementById("uuidv1_info").style.display = "block";
214
}
215
</script>
62 daniel-mar 216
<p><a id="uuidv1_info_button" href="javascript:show_uuidv1_info()">Show format</a>
35 daniel-mar 217
<pre id="uuidv1_info" style="display:none">Variant 1, Version 1 UUID:
37 daniel-mar 218
- 32 bit Low <abbr title="Count of 100ns intervals passed since 15 Oct 1582 00:00:00 GMT">Time</abbr>
219
- 16 bit Mid <abbr title="Count of 100ns intervals passed since 15 Oct 1582 00:00:00 GMT">Time</abbr>
35 daniel-mar 220
-  4 bit Version (fix 0x1)
37 daniel-mar 221
- 12 bit High <abbr title="Count of 100ns intervals passed since 15 Oct 1582 00:00:00 GMT">Time</abbr>
35 daniel-mar 222
-  2 bit Variant (fix 0b10)
223
-  6 bit Clock Sequence High
224
-  8 bit Clock Sequence Low
225
- 48 bit MAC Address</pre></p>
226
 
31 daniel-mar 227
<?php
228
if (AUTO_NEW_UUIDS > 0) { /** @phpstan-ignore-line */
35 daniel-mar 229
    echo '<p>Here are '.AUTO_NEW_UUIDS.' UUIDs that were created just for you! (Reload the page to get more)</p>';
31 daniel-mar 230
 
231
    echo '<pre>';
70 daniel-mar 232
    for ($i=0; $i<AUTO_NEW_UUIDS; $i++) {
31 daniel-mar 233
        $uuid = gen_uuid_v1();
234
        echo '<a href="interprete_uuid.php?uuid='.$uuid.'">'.$uuid.'</a><br>';
235
    }
236
    echo '</pre>';
237
}
238
?>
239
 
30 daniel-mar 240
<form method="GET" action="interprete_uuid.php">
31 daniel-mar 241
    <input type="hidden" name="version" value="1">
242
    <input type="hidden" name="uuid" value="CREATE"> <input type="submit" value="Create and display another UUID">
30 daniel-mar 243
</form>
244
 
82 daniel-mar 245
<h3 id="gen_uuidv8_sqlserver">Generate SQL server sortable time-based (version 8) UUID</h3>
246
 
247
<p><i>The sorting of SQL Server is rather confusing and incompatible with UUIDv6 and UUIDv7.<br>
248
Therefore this method developed by <a href="https://www.hickelsoft.de/">HickelSOFT</a>
249
generates UUID which are sortable by SQL Server.<br>
250
Version 1: Resolution of 1 milliseconds, random part of 16 bits, local timezone, NOT UUIDv8 conform.<br>
251
Version 2: Resolution of 1 milliseconds, random part of 18 bits, UTC time, UUIDv8 conform.</i><br>
252
<a href="https://gist.github.com/danielmarschall/7fafd270a3bc107d38e8449ce7420c25">C# implementation</a> |
253
<a href="https://github.com/danielmarschall/uuid_mac_utils/blob/master/includes/uuid_utils.inc.php">PHP implementation</a>
254
</p>
255
 
256
<script>
257
function show_uuidv8_sqlserver_info() {
258
        document.getElementById("uuidv8_sqlserver_info_button").style.display = "none";
259
        document.getElementById("uuidv8_sqlserver_info").style.display = "block";
260
}
261
</script>
262
<p><a id="uuidv8_sqlserver_info_button" href="javascript:show_uuidv8_sqlserver_info()">Show format</a>
263
<pre id="uuidv8_sqlserver_info" style="display:none">Version 2: Resolution of 1 milliseconds, random part of 18 bits, UTC time, UUIDv8 conform:
264
- 16 bit Random data
265
-  8 bit UTC Milliseconds transformed from 1000ms to 0..255 (hex encoded)
266
-  8 bit UTC Seconds (hex encoded)
267
- 16 bit UTC Minute of the day (1..1440, hex encoded)
268
-  4 bit UUID version 8
269
- 12 bit UTC Day of the year (1..366, hex encoded)
270
-  2 bit UUID Variant (0b10)
271
-  2 bit Random data
272
- 12 bit UTC Year (hex encoded)
273
- 48 bit Signature "HICKEL" = 0x4849434B454C
274
 
275
Version 1: Resolution of 1 milliseconds, random part of 16 bits, local timezone, NOT UUIDv8 conform.
276
- 16 bit Random data
277
-  8 bit Generator's local timezone Milliseconds transformed from 1000ms to 0..255 (hex encoded)
278
-  8 bit Generator's local timezone Seconds (BCD encoded)
279
-  8 bit Generator's local timezone Minute (BCD encoded)
280
-  8 bit Generator's local timezone Hour (BCD encoded)
281
-  8 bit Generator's local timezone Day (BCD encoded)
282
-  8 bit Generator's local timezone Month (BCD encoded)
283
-  8 bit Generator's local timezone 2-digit year (BCD encoded)
284
-  8 bit Generator's local timezone 2-digit century (BCD encoded)
285
- 48 bit Signature 0x000000000000</pre></p>
286
 
287
<?php
288
if (AUTO_NEW_UUIDS > 0) { /** @phpstan-ignore-line */
289
    echo '<p>Here are '.AUTO_NEW_UUIDS.' UUIDs that were created just for you! (Reload the page to get more)</p>';
290
 
291
    echo '<pre>';
292
    for ($i=0; $i<AUTO_NEW_UUIDS; $i++) {
293
        $uuid = gen_uuid_v8_sqlserver_sortable();
294
        echo '<a href="interprete_uuid.php?uuid='.$uuid.'">'.$uuid.'</a><br>';
295
    }
296
    echo '</pre>';
297
}
298
?>
299
 
300
<form method="GET" action="interprete_uuid.php">
301
    <input type="hidden" name="version" value="8_sqlserver_v2">
302
    <input type="hidden" name="uuid" value="CREATE"> <input type="submit" value="Create and display another UUID (new version)">
303
</form><br>
304
 
305
<form method="GET" action="interprete_uuid.php">
306
    <input type="hidden" name="version" value="8_sqlserver_v1">
307
    <input type="hidden" name="uuid" value="CREATE"> <input type="submit" value="Create and display another UUID (old version)">
308
</form>
309
 
310
 
311
 
31 daniel-mar 312
<h2 id="gen_other_uuid">Generate other UUID types</h2>
30 daniel-mar 313
 
47 daniel-mar 314
<p><i>The following types of UUIDs are less common and/or require special knowledge. Please only use the following
30 daniel-mar 315
generators if you know what you are doing.</i></p>
316
 
53 daniel-mar 317
<h3 id="gen_uuid_ncs">NCS (variant 0) UUID</h3>
30 daniel-mar 318
 
53 daniel-mar 319
<p>The <abbr title="Network Computing System">NCS</abbr> UUIDs are a legacy format
320
initially designed by Apollo Computer that cannot be generated anymore, because the
30 daniel-mar 321
amount of available timestamp bits was exhausted on <strong>5 September 2015</strong>.
53 daniel-mar 322
As an example, here is the last possible NCS UUID (all bits of the timestamp are set to 1) for IP address 127.0.0.1:
34 daniel-mar 323
<a href="interprete_uuid.php?uuid=ffffffff-ffff-0000-027f-000001000000"><code>ffffffff-ffff-0000-027f-000001000000</code></a>.</p>
30 daniel-mar 324
 
35 daniel-mar 325
<script>
326
function show_uuidnce_info() {
327
        document.getElementById("uuidnce_info_button").style.display = "none";
328
        document.getElementById("uuidnce_info").style.display = "block";
329
}
330
</script>
62 daniel-mar 331
<p><a id="uuidnce_info_button" href="javascript:show_uuidnce_info()">Show format</a>
35 daniel-mar 332
<pre id="uuidnce_info" style="display:none">Variant 0 UUID:
37 daniel-mar 333
- 32 bit High <abbr title="Count of 4&#xB5;s intervals passed since 1 Jan 1980 00:00:00 GMT">Time</abbr>
334
- 16 bit Low <abbr title="Count of 4&#xB5;s intervals passed since 1 Jan 1980 00:00:00 GMT">Time</abbr>
35 daniel-mar 335
- 16 bit Reserved
336
-  1 bit Variant (fix 0b0)
37 daniel-mar 337
-  7 bit <abbr title="socket_$unspec (0x0)
338
socket_$unix (0x1)
339
socket_$internet (0x2)
340
socket_$implink (0x3)
341
socket_$pup (0x4)
342
socket_$chaos (0x5)
343
socket_$ns (0x6)
344
socket_$nbs (0x7)
345
socket_$ecma (0x8)
346
socket_$datakit (0x9)
347
socket_$ccitt (0xA)
348
socket_$sna (0xB)
349
socket_$unspec2 (0xC)
350
socket_$dds (0xD)">Family</abbr>
35 daniel-mar 351
- 56 bit Node</pre></p>
352
 
31 daniel-mar 353
<h3 id="gen_uuidv2">Generate DCE Security (version 2) UUID</h3>
30 daniel-mar 354
 
37 daniel-mar 355
<p><i>An UUIDv2 contains information about the creator (person, group, or organization), the generating system (MAC address), and time.
35 daniel-mar 356
The creator information replaced parts of the time bits, therefore the time resolution is very low.</i></p>
357
 
358
<script>
359
function show_uuidv2_info() {
360
        document.getElementById("uuidv2_info_button").style.display = "none";
361
        document.getElementById("uuidv2_info").style.display = "block";
362
}
363
</script>
62 daniel-mar 364
<p><a id="uuidv2_info_button" href="javascript:show_uuidv2_info()">Show format</a>
35 daniel-mar 365
<pre id="uuidv2_info" style="display:none">Variant 1, Version 2 UUID:
366
- 32 bit Local Domain Number
37 daniel-mar 367
- 16 bit Mid <abbr title="Count of 429.4967296s intervals passed since 15 Oct 1582 00:00:00 GMT">Time</abbr>
35 daniel-mar 368
-  4 bit Version (fix 0x2)
37 daniel-mar 369
- 12 bit High <abbr title="Count of 429.4967296s intervals passed since 15 Oct 1582 00:00:00 GMT">Time</abbr>
35 daniel-mar 370
-  2 bit Variant (fix 0b10)
371
-  6 bit Clock Sequence
37 daniel-mar 372
-  8 bit <abbr title="0 = person
373
1 = group
374
2 = org
375
3-255 = site-defined">Local Domain</abbr>
35 daniel-mar 376
- 48 bit MAC Address</pre></p>
377
 
30 daniel-mar 378
<form method="GET" action="interprete_uuid.php">
2 daniel-mar 379
        <input type="hidden" name="version" value="2">
35 daniel-mar 380
        <label>Domain (8&nbsp;bits):</label><select name="domain_choose" id="dce_domain_choice" onchange="javascript:dce_domain_choose();">
34 daniel-mar 381
                <option value="uid">Person (e.g. POSIX UID)</option>
382
                <option value="gid">Group (e.g. POSIX GID)</option>
383
                <option value="org">Organization</option>
2 daniel-mar 384
                <option value="site">Site-defined</option>
62 daniel-mar 385
        </select> = Address Family ID: <input type="number" min="0" max="255" name="dce_domain" value="" id="dce_domain" style="width:50px" pattern="[0-9]+"> (decimal notation)<br>
35 daniel-mar 386
        <label>Value (32&nbsp;bits):</label><input type="number" min="0" max="4294967295" name="dce_id" value="0" id="dce_id" style="width:200px" pattern="[0-9]+"> (decimal notation)<br>
37 daniel-mar 387
        <font color="red">Warning</font>: The timestamp has an accuracy of 7:10 minutes,
30 daniel-mar 388
        therefore the uniqueness of these UUIDs is not guaranteed!<br><br>
59 daniel-mar 389
        <input type="hidden" name="uuid" value="CREATE"> <input type="submit" value="Create UUIDv2">
2 daniel-mar 390
</form>
391
<script>
392
function dce_domain_choose() {
393
        var ns = document.getElementById('dce_domain_choice').value;
394
        if (ns == "uid") {
395
                document.getElementById('dce_domain').value = "0";
396
        }
397
        if (ns == "gid") {
398
                document.getElementById('dce_domain').value = "1";
399
        }
400
        if (ns == "org") {
401
                document.getElementById('dce_domain').value = "2";
402
        }
403
        if (ns == "site") {
404
                document.getElementById('dce_domain').value = "";
405
        }
406
}
407
dce_domain_choose();
408
</script>
409
 
61 daniel-mar 410
<h3 id="gen_uuidv35">Generate name-based (version 3 / 5 / <font color="green">New: 8</font>) UUID</h3>
2 daniel-mar 411
 
57 daniel-mar 412
<p><i>An UUIDv3 is made out of a MD5 hash and an UUIDv5 is made out of a SHA1 hash.
413
The revision of RFC4122 also contains an example for a custom UUIDv8 that
72 daniel-mar 414
uses modern hash algorithms.</i></p>
35 daniel-mar 415
 
416
<script>
417
function show_uuidv35_info() {
418
        document.getElementById("uuidv35_info_button").style.display = "none";
419
        document.getElementById("uuidv35_info").style.display = "block";
420
}
421
</script>
62 daniel-mar 422
<p><a id="uuidv35_info_button" href="javascript:show_uuidv35_info()">Show format</a>
58 daniel-mar 423
<pre id="uuidv35_info" style="display:none">Variant 1, Version 3/5/8 UUID:
35 daniel-mar 424
- 48 bit Hash High
58 daniel-mar 425
-  4 bit Version (fix 0x3, 0x5, or 0x8)
35 daniel-mar 426
- 12 bit Hash Mid
427
-  2 bit Variant (fix 0b10)
62 daniel-mar 428
- 62 bit Hash Low
35 daniel-mar 429
 
62 daniel-mar 430
 
75 daniel-mar 431
<u>As shown in <a href="https://datatracker.ietf.org/doc/draft-ietf-uuidrev-rfc4122bis/">draft-ietf-uuidrev-rfc4122bis-12</a> Appendix C.2:</u>
69 daniel-mar 432
UUIDv8(<i>HashAlgo</i>, <i>NameSpaceUuid</i>, <i>Data</i>) := <abbr title="Adds UUID variant 0b10 and version 8">ConvertRawBytesToUuid_v8</abbr>(<i>HashAlgo</i>( Binary[<i>NameSpaceUuid</i>] || <i>Data</i> )).
67 daniel-mar 433
 
62 daniel-mar 434
</pre></p>
435
 
35 daniel-mar 436
<style>
437
label {
438
        width:120px;
439
        text-align:left;
440
        margin-right: 20px;
441
        display:inline-block;
442
}
443
</style>
444
 
2 daniel-mar 445
<form method="GET" action="interprete_uuid.php">
59 daniel-mar 446
        <label>Hash algorithm:</label><select name="version" id="nb_version" onchange="javascript:nb_version_choose();">
447
                <?php
67 daniel-mar 448
 
75 daniel-mar 449
                echo "\t\t<option disabled>--- UUIDv3 (defined in RFC 4122) ---</option>\n";
67 daniel-mar 450
                echo "\t\t<option value=\"3\">MD5</option>\n";
75 daniel-mar 451
                echo "\t\t<option disabled>--- UUIDv5 (defined in RFC 4122) ---</option>\n";
67 daniel-mar 452
                echo "\t\t<option value=\"5\" selected>SHA1</option>\n";
75 daniel-mar 453
                echo "\t\t<option disabled>--- UUIDv8 (shown in Internet Draft 12, Appendix C.2) ---</option>\n";
69 daniel-mar 454
                $tmp = [];
455
                $algos = hash_algos();
456
                $algos[] = 'shake128';
457
                $algos[] = 'shake256';
458
                foreach ($algos as $algo) {
459
                        if ($algo == 'md5') continue; // use UUIDv3 instead
460
                        if ($algo == 'sha1') continue; // use UUIDv5 instead
461
                        $friendlyName = strtoupper($algo);
462
 
463
                        if ($algo == 'shake128') $bits = 999;
464
                        else if ($algo == 'shake256') $bits = 999;
465
                        else $bits = strlen(hash($algo, '', true)) * 8;
75 daniel-mar 466
                        if ($bits < 128) $friendlyName .= " (Small hash size! $bits bits)"; // <-- this is not described in Appendix C.2
69 daniel-mar 467
 
82 daniel-mar 468
                        $tmp[$friendlyName] = '<option value="8_namebased_'.$algo.'">'.htmlentities($friendlyName).'</option>';
69 daniel-mar 469
                }
470
                natsort($tmp);
471
                foreach ($tmp as $html) {
472
                        echo "\t\t$html\n";
473
                }
474
 
59 daniel-mar 475
                ?>
75 daniel-mar 476
        </select><br>
35 daniel-mar 477
        <label>Namespace:</label><select name="namespace_choose" id="nb_nsc" onchange="javascript:nb_ns_choose();">
2 daniel-mar 478
                <option value="dns">DNS</option>
479
                <option value="url">URL</option>
480
                <option value="oid">OID</option>
481
                <option value="x500">X.500 DN</option>
76 daniel-mar 482
                <option value="r74n">R74n Namespace</option>
35 daniel-mar 483
                <!-- <option value="oidplus_ns">OIDplus ns only</option> -->
484
                <!-- <option value="oidplus_ns_val">OIDplus ns+val</option> -->
28 daniel-mar 485
                <!-- <option value="oidplus_pubkey">OIDplus pubkey</option> -->
2 daniel-mar 486
                <option value="other">Other</option>
59 daniel-mar 487
        </select> = Namespace UUID: <input type="text" name="nb_ns" value="" id="nb_ns" style="width:270px" onchange="javascript:nb_ns_textchange();" pattern="[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}"><br>
35 daniel-mar 488
        <label>Value:</label><input type="text" name="nb_val" value="" id="nb_val" style="width:300px"><br>
30 daniel-mar 489
        <font color="red">Warning</font>: These UUIDs do not contain a timestamp,
490
        therefore the uniqueness of these UUIDs is not guaranteed!<br><br>
59 daniel-mar 491
        <input type="hidden" name="uuid" value="CREATE"> <input type="submit" id="nb_create_btn" value="Create UUID">
2 daniel-mar 492
</form>
493
<script>
59 daniel-mar 494
function nb_version_choose() {
495
        var ver = document.getElementById('nb_version').value;
496
        document.getElementById('nb_create_btn').value = 'Create UUIDv' + ver.substr(0,1);
497
}
35 daniel-mar 498
function nb_ns_textchange() {
499
        var ns = document.getElementById('nb_ns').value.toLowerCase();
500
        if (ns == "6ba7b810-9dad-11d1-80b4-00c04fd430c8") {
501
                if (document.getElementById('nb_nsc').value != "dns") {
502
                        document.getElementById('nb_nsc').value = "dns";
57 daniel-mar 503
                        document.getElementById('nb_val').value = "www.example.com";
35 daniel-mar 504
                }
505
        }
506
        else if (ns == "6ba7b811-9dad-11d1-80b4-00c04fd430c8") {
507
                if (document.getElementById('nb_nsc').value != "url") {
508
                        document.getElementById('nb_nsc').value = "url";
57 daniel-mar 509
                        document.getElementById('nb_val').value = "http://www.example.com/";
35 daniel-mar 510
                }
511
        }
512
        else if (ns == "6ba7b812-9dad-11d1-80b4-00c04fd430c8") {
513
                if (document.getElementById('nb_nsc').value != "oid") {
514
                        document.getElementById('nb_nsc').value = "oid";
515
                        document.getElementById('nb_val').value = "2.999";
516
                }
517
        }
518
        else if (ns == "6ba7b814-9dad-11d1-80b4-00c04fd430c8") {
519
                if (document.getElementById('nb_nsc').value != "x500") {
520
                        document.getElementById('nb_nsc').value = "x500";
521
                        document.getElementById('nb_val').value = "UID=jsmith,DC=example,DC=net";
522
                }
523
        }
76 daniel-mar 524
        else if (ns == "ca069732-780c-11ee-b962-000000000074") { // https://r74n.com/id/uuid
525
                if (document.getElementById('nb_nsc').value != "r74n") {
526
                        document.getElementById('nb_nsc').value = "r74n";
527
                        document.getElementById('nb_val').value = "ants";
528
                }
529
        }
35 daniel-mar 530
        else {
531
                if (document.getElementById('nb_nsc').value != "other") {
532
                        document.getElementById('nb_nsc').value = "other";
533
                        document.getElementById('nb_val').value = "";
534
                }
535
        }
536
}
2 daniel-mar 537
function nb_ns_choose() {
538
        var ns = document.getElementById('nb_nsc').value;
539
        if (ns == "dns") {
540
                document.getElementById('nb_ns').value = "6ba7b810-9dad-11d1-80b4-00c04fd430c8";
57 daniel-mar 541
                document.getElementById('nb_val').value = "www.example.com";
2 daniel-mar 542
        }
35 daniel-mar 543
        else if (ns == "url") {
2 daniel-mar 544
                document.getElementById('nb_ns').value = "6ba7b811-9dad-11d1-80b4-00c04fd430c8";
57 daniel-mar 545
                document.getElementById('nb_val').value = "http://www.example.com/";
2 daniel-mar 546
        }
35 daniel-mar 547
        else if (ns == "oid") {
2 daniel-mar 548
                document.getElementById('nb_ns').value = "6ba7b812-9dad-11d1-80b4-00c04fd430c8";
549
                document.getElementById('nb_val').value = "2.999";
550
        }
35 daniel-mar 551
        else if (ns == "x500") {
2 daniel-mar 552
                document.getElementById('nb_ns').value = "6ba7b814-9dad-11d1-80b4-00c04fd430c8";
553
                document.getElementById('nb_val').value = "UID=jsmith,DC=example,DC=net";
554
        }
76 daniel-mar 555
        else if (ns == "r74n") { // https://r74n.com/id/uuid
556
                document.getElementById('nb_ns').value = "ca069732-780c-11ee-b962-000000000074";
557
                document.getElementById('nb_val').value = "ants";
558
        }
35 daniel-mar 559
        /*
560
        else if (ns == "oidplus_ns") {
2 daniel-mar 561
                document.getElementById('nb_ns').value = "0943e3ce-4b79-11e5-b742-78e3b5fc7f22";
562
                document.getElementById('nb_val').value = "ipv4";
563
        }
35 daniel-mar 564
        else if (ns == "oidplus_ns_val") {
2 daniel-mar 565
                document.getElementById('nb_ns').value = "ad1654e6-7e15-11e4-9ef6-78e3b5fc7f22";
566
                document.getElementById('nb_val').value = "ipv4:8.8.8.8";
567
        }
35 daniel-mar 568
        else if (ns == "oidplus_ns_pubkey") {
28 daniel-mar 569
                document.getElementById('nb_ns').value = "fd16965c-8bab-11ed-8744-3c4a92df8582";
31 daniel-mar 570
                document.getElementById('nb_val').value = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqg/PnsC1WX3C1/mUSLuk0DIaDHtEsxBnG0auYJRJ1hBtbUUvItbK0odlKrX2SFo1MJJpu/SSxTzAgqkKZsZe3cCFkgA1svfuH9i94oGLjJ4n0kRJEGlanCmGndJBfIqGDJaQE2BJ8tLxeBrpkd9l0KvJsjhRmqJAb9KYK3KYFsWvT+wyjD3UJ1eHcgLbF/Qb3cwMU/u7Fs7ZpsNMW4phDPlsYsk9XHFpJ1/UCj6G53mYRfOC/ouDdGShlbVLB15s0V95QpnU/7lL8mJ2lE+sTZekGNBA4XbJv2gs21cR4E8zc/z+NyZS7117DYZoJqrAN8sKz6xGoKgQF6wueCK5qQIDAQAB";
28 daniel-mar 571
        }
572
        */
35 daniel-mar 573
        else if (ns == "other") {
2 daniel-mar 574
                document.getElementById('nb_ns').value = "";
575
                document.getElementById('nb_val').value = "";
576
        }
577
}
59 daniel-mar 578
nb_version_choose();
2 daniel-mar 579
nb_ns_choose();
580
</script>
581
 
61 daniel-mar 582
<h3 id="gen_uuidv8"><font color="green">New:</font> Generate Custom (version 8) UUID</h3>
34 daniel-mar 583
 
37 daniel-mar 584
<p><i>UUIDv8 is made of 122 bits application-specific / custom data. The other 6 bits are used to specify the variant and version of the UUID, to make it RFC-compatible.</i></p>
35 daniel-mar 585
 
586
<script>
587
function show_uuidv8_info() {
588
        document.getElementById("uuidv8_info_button").style.display = "none";
589
        document.getElementById("uuidv8_info").style.display = "block";
590
}
65 daniel-mar 591
function uuidv8_changedec(block, len) {
592
        var x = document.getElementById("v8_block"+block+"_dec").value;
593
        if (x.trim() == "") x = 0;
594
        x = parseInt(x);
595
        if (isNaN(x)) {
596
                x = "???";
597
        } else {
598
                x = x.toString(16).padStart(len, '0');
599
                if ((len > 0) && (x.length > len)) x = "Overflow";
600
        }
601
        document.getElementById("v8_block"+block+"_hex").value = x;
602
}
603
function uuidv8_changehex(block, len) {
604
        var x = document.getElementById("v8_block"+block+"_hex").value;
605
        if (x.trim() == "") x = 0;
606
        x = parseInt(x, 16);
607
        if (isNaN(x)) {
608
                x = "???";
609
        } else {
610
                x = x.toString().padStart(len, '0');
611
                if ((len > 0) && (x.length > len)) x = "Overflow"; // Note: For block 3/4, the overflow actually happens at 12/14 bits, not at 4 nibbles (16 bits)
612
        }
613
        document.getElementById("v8_block"+block+"_dec").value = x;
614
}
35 daniel-mar 615
</script>
62 daniel-mar 616
<p><a id="uuidv8_info_button" href="javascript:show_uuidv8_info()">Show format</a>
35 daniel-mar 617
<pre id="uuidv8_info" style="display:none">Variant 1, Version 8 UUID:
63 daniel-mar 618
- 48 bit Custom data [Block 1+2]
35 daniel-mar 619
-  4 bit Version (fix 0x8)
63 daniel-mar 620
- 12 bit Custom data [Block 3]
35 daniel-mar 621
-  2 bit Variant (fix 0b10)
63 daniel-mar 622
- 62 bit Custom data [Block 4+5]</pre></p>
35 daniel-mar 623
 
34 daniel-mar 624
<form method="GET" action="interprete_uuid.php">
625
        <input type="hidden" name="version" value="8">
65 daniel-mar 626
 
627
        <label>Block&nbsp;1 (32&nbsp;bits):</label>0x<input type="text" name="block1" value="00000000" maxlength="8" id="v8_block1_hex" onkeyup="uuidv8_changehex(1, 0)" style="width:150px" pattern="[0-9a-fA-F]+"> = Decimal
628
        <input type="number" name="block1dec" value="0" min="0" maxlength="20" id="v8_block1_dec" onmouseup="uuidv8_changedec(1, 8)" onkeyup="uuidv8_changedec(1, 8)" style="width:150px"><br>
629
 
630
        <label>Block&nbsp;2 (16&nbsp;bits):</label>0x<input type="text" name="block2" value="0000" maxlength="4" id="v8_block2_hex" onkeyup="uuidv8_changehex(2, 0)" style="width:150px" pattern="[0-9a-fA-F]+"> = Decimal
631
        <input type="number" name="block2dec" value="0" min="0" maxlength="20" id="v8_block2_dec" onmouseup="uuidv8_changedec(2, 4)" onkeyup="uuidv8_changedec(2, 4)" style="width:150px"><br>
632
 
633
        <label>Block&nbsp;3 (<abbr title="The high 4 bits are occupied by the UUID version = 8">12&nbsp;bits</abbr>):</label>0x<input type="text" name="block3" value="0000" maxlength="4" id="v8_block3_hex" onkeyup="uuidv8_changehex(3, 0)" style="width:150px" pattern="[0-9a-fA-F]+"> = Decimal
634
        <input type="number" name="block3dec" value="0" min="0" maxlength="20" id="v8_block3_dec" onmouseup="uuidv8_changedec(3, 4)" onkeyup="uuidv8_changedec(3, 4)" style="width:150px"><br>
635
 
636
        <label>Block&nbsp;4 (<abbr title="The high 2 bits are occupied by the UUID variant = 0b10">14&nbsp;bits</abbr>):</label>0x<input type="text" name="block4" value="0000" maxlength="4" id="v8_block4_hex" onkeyup="uuidv8_changehex(4, 0)" style="width:150px" pattern="[0-9a-fA-F]+"> = Decimal
637
        <input type="number" name="block4dec" value="0" min="0" maxlength="20" id="v8_block4_dec" onmouseup="uuidv8_changedec(4, 4)" onkeyup="uuidv8_changedec(4, 4)" style="width:150px"><br>
638
 
639
        <label>Block&nbsp;5 (48&nbsp;bits):</label>0x<input type="text" name="block5" value="000000000000" maxlength="12" id="v8_block5_hex" onkeyup="uuidv8_changehex(5, 0)" style="width:150px" pattern="[0-9a-fA-F]+"> = Decimal
640
        <input type="number" name="block5dec" value="0" min="0" maxlength="20" id="v8_block5_dec" onmouseup="uuidv8_changedec(5, 12)" onkeyup="uuidv8_changedec(5, 12)" style="width:150px"><br>
641
 
34 daniel-mar 642
        <font color="red">Warning</font>: These UUIDs do not contain a timestamp,
643
        therefore the uniqueness of these UUIDs is not guaranteed!<br><br>
59 daniel-mar 644
        <input type="hidden" name="uuid" value="CREATE"> <input type="submit" value="Create UUIDv8">
34 daniel-mar 645
</form>
646
 
31 daniel-mar 647
<h2 id="interpret_uuid">Interpret a UUID</h2>
2 daniel-mar 648
 
30 daniel-mar 649
<p>You can enter a UUID in the following notations:</p>
2 daniel-mar 650
 
651
<ul>
652
        <li>Classic notation (case insensitive, curly braces optional): <code>9e83839a-5967-11e4-8c1c-78e3b5fc7f22</code></li>
653
        <li>As OID: <code>2.25.210700883446948645633376489934419689250</code></li>
654
</ul>
655
 
656
<p>The script will output:</p>
657
 
658
<ul>
659
        <li>Notation as UUID and OID</li>
35 daniel-mar 660
        <li>Version, variant, and additional data (date and time, clock sequence, node id, etc.)</li>
2 daniel-mar 661
</ul>
662
 
30 daniel-mar 663
<p>Please enter a UUID or UUID OID:</p>
2 daniel-mar 664
 
665
<form method="GET" action="interprete_uuid.php">
32 daniel-mar 666
        <input type="text" name="uuid" value="" style="width:300px"> <input type="submit" value="Interprete">
2 daniel-mar 667
</form>
668
 
31 daniel-mar 669
<h2 id="interpret_mac">Interpret a MAC address (<abbr title="Media Access Control">MAC</abbr> /
26 daniel-mar 670
<abbr title="Extended Unique Identifier">EUI</abbr> /
671
<abbr title="Extended Local Identifier">ELI</abbr> /
672
<abbr title="Standard Assigned Identifier">SAI</abbr> /
673
<abbr title="Administratively Assigned Identifier">AAI</abbr>)</h2>
2 daniel-mar 674
 
30 daniel-mar 675
<p>You can enter a UUID in the following notations:</p>
2 daniel-mar 676
 
677
<ul>
678
        <li><code>AA-BB-CC-DD-EE-FF</code></li>
679
        <li><code>AA:BB:CC:DD:EE:FF</code></li>
680
        <li><code>AABBCC.DDEEFF</code> (case insensitive)</li>
16 daniel-mar 681
        <li><code>AA-BB-CC-DD-EE-FF-11-22</code> (EUI-64)</li>
682
        <li><code>AA:BB:CC:DD:EE:FF-11-22</code> (EUI-64)</li>
683
        <li><code>fe80::1322:33ff:fe44:5566</code> (IPv6 Link Local / EUI-64)</li>
2 daniel-mar 684
</ul>
685
 
686
<p>The script will output:</p>
687
 
688
<ul>
689
        <li>Information about the I/G and U/L flags.</li>
690
        <li>Information about the entry in the IEEE registry, if available.</li>
691
        <li>Information about the registrant, if available.</li>
692
</ul>
693
 
29 daniel-mar 694
<p>Please enter a MAC (EUI, ELI, SAI, AAI), or IPv6-Link-Local address:</p>
2 daniel-mar 695
 
696
<form method="GET" action="interprete_mac.php">
32 daniel-mar 697
        <input type="text" name="mac" value="" style="width:250px"> <input type="submit" value="Interprete">
2 daniel-mar 698
</form>
699
 
62 daniel-mar 700
<h3 id="gen_aai">Generate an <abbr title="Administratively Assigned Identifier">AAI</abbr></h3>
41 daniel-mar 701
 
702
<p><i>An Administratively Assigned Identifier (AAI) is a MAC address which can be locally defined
703
by applications or an administrator. Unlike the EUI, an AAI is NOT worldwide unique.</i></p>
704
 
705
<form method="GET" action="interprete_mac.php">
706
    <input type="hidden" name="aai_gen" value="1">
707
    <input type="hidden" name="aai_gen_bits" value="48">
708
    <input type="hidden" name="aai_gen_multicast" value="0">
709
    <input type="hidden" name="uuid" value="CREATE"> <input type="submit" value="Generate AAI-48">
710
</form>
711
 
712
<br>
713
 
714
<form method="GET" action="interprete_mac.php">
715
    <input type="hidden" name="aai_gen" value="1">
716
    <input type="hidden" name="aai_gen_bits" value="64">
717
    <input type="hidden" name="aai_gen_multicast" value="0">
718
    <input type="hidden" name="uuid" value="CREATE"> <input type="submit" value="Generate AAI-64">
719
</form>
720
 
721
<p>The following options are rather unusual, but are implemented for the sake of completeness:</p>
722
 
723
<form method="GET" action="interprete_mac.php">
724
    <input type="hidden" name="aai_gen" value="1">
725
    <input type="hidden" name="aai_gen_bits" value="48">
726
    <input type="hidden" name="aai_gen_multicast" value="1">
727
    <input type="hidden" name="uuid" value="CREATE"> <input type="submit" value="Generate Multicast AAI-48">
728
</form>
729
 
730
<br>
731
 
732
<form method="GET" action="interprete_mac.php">
733
    <input type="hidden" name="aai_gen" value="1">
734
    <input type="hidden" name="aai_gen_bits" value="64">
735
    <input type="hidden" name="aai_gen_multicast" value="1">
736
    <input type="hidden" name="uuid" value="CREATE"> <input type="submit" value="Generate Multicast AAI-64">
737
</form>
738
 
22 daniel-mar 739
<br><br><br>
740
 
2 daniel-mar 741
</body>
742
 
743
</html>