GY-63_MS5611/libraries/UUID/README.md

200 lines
6.6 KiB
Markdown
Raw Normal View History

2022-06-14 09:20:04 -04:00
[![Arduino CI](https://github.com/RobTillaart/UUID/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
[![Arduino-lint](https://github.com/RobTillaart/UUID/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/UUID/actions/workflows/arduino-lint.yml)
[![JSON check](https://github.com/RobTillaart/UUID/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/UUID/actions/workflows/jsoncheck.yml)
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/UUID/blob/master/LICENSE)
[![GitHub release](https://img.shields.io/github/release/RobTillaart/UUID.svg?maxAge=3600)](https://github.com/RobTillaart/UUID/releases)
# UUID
Arduino library for generating UUID strings.
## Description
2023-02-02 08:42:13 -05:00
This library provides a UUID generator class.
2022-06-15 01:34:09 -04:00
A UUID is an Universally Unique IDentifier of 128 bits.
2022-11-27 03:39:34 -05:00
These are typically written in the following format, defined in RFC-4122.
2022-06-14 09:20:04 -04:00
2022-06-15 01:34:09 -04:00
```
0ac82d02-002b-4ccb-b96c-1c7839cbc4c0
^ ^
```
2022-06-14 09:20:04 -04:00
2022-06-15 01:34:09 -04:00
The length is 32 hexadecimal digits + four hyphens = 36 characters.
2023-02-02 08:42:13 -05:00
Note that the hexadecimal digits are all lower case.
2022-06-14 09:20:04 -04:00
2022-11-27 03:39:34 -05:00
The 0.1.1 version of the lib tries to follow the RFC-4122,
2022-06-15 01:34:09 -04:00
for version 4 (random generated) and variant 1.
In the format above the version 4 is indicated by the first arrow and must be 4.
The variant 1 is at the position of the second arrow.
2022-11-27 03:39:34 -05:00
This nibble must be 8, 9, A or B.
2022-06-15 01:34:09 -04:00
All the remaining bits are random.
2022-06-14 09:20:04 -04:00
2023-02-02 08:42:13 -05:00
The basis for the UUID class is a Marsaglia pseudo random number generator (PRNG).
Note: This PRNG must be seeded with two real random uint32_t to get real random UUID's.
2022-11-27 03:39:34 -05:00
Regular reseeding with external entropy improves randomness.
2023-02-02 08:42:13 -05:00
Default it will generate the same sequence as it uses the same seeds.
This is useful for testing.
2022-06-15 01:34:09 -04:00
Often one sees also the term GUID = Globally Unique Identifier.
2023-02-02 08:42:13 -05:00
Tested on Arduino UNO + ESP32.
2022-06-14 09:20:04 -04:00
2022-06-15 01:34:09 -04:00
- https://en.wikipedia.org/wiki/Universally_unique_identifier
- https://www.ietf.org/rfc/rfc4122.txt
2022-06-14 09:20:04 -04:00
## Interface
2023-02-02 08:42:13 -05:00
```cpp
#include "UUID.h"
```
2022-06-14 09:20:04 -04:00
2023-02-02 08:42:13 -05:00
#### UUID class
2022-06-14 09:20:04 -04:00
2022-06-15 01:34:09 -04:00
The UUID class has only a few methods.
- **UUID()** Constructor, initializes internals an generates a default UUID.
2022-06-14 09:20:04 -04:00
- **void seed(uint32_t s1, uint32_t s2 = 0)** reseeds the internal
pseudo random number generator.
2022-06-15 01:34:09 -04:00
It is mandatory to set s1 while s2 is optional.
The combination {0, 0} is not allowed and overruled in software.
- **void generate()** generates a new UUID depending on the mode.
- **UUID_MODE_RANDOM**: all UUID bits are random.
2023-02-02 08:42:13 -05:00
- **UUID_MODE_VARIANT4**: the UUID (tries to) conform to version 4 variant 1. See above. This is the default.
2022-06-14 09:20:04 -04:00
- **char \* toCharArray()** returns a pointer to a char buffer
2022-06-15 01:34:09 -04:00
representing the last generated UUID.
Multiple subsequent calls to **toCharArray()** gives the same UUID
until **generate()** is called again.
2023-02-02 08:42:13 -05:00
#### Mode
2022-06-15 01:34:09 -04:00
2023-02-02 08:42:13 -05:00
Only two modi are supported, default is the **UUID_MODE_VARIANT4**.
2022-11-27 03:39:34 -05:00
This is conform RFC-4122.
2022-06-15 01:34:09 -04:00
- **void setVariant4Mode()** set mode to **UUID_MODE_VARIANT4**.
- **void setRandomMode()** set mode to **UUID_MODE_RANDOM**.
- **uint8_t getMode()** returns mode set.
2022-06-14 09:20:04 -04:00
2023-02-02 08:42:13 -05:00
#### Printable
2022-06-14 09:20:04 -04:00
2023-02-02 08:42:13 -05:00
The UUID class implements the Printable interface.
2022-06-15 01:34:09 -04:00
This allows one to print the UUID object directly over Serial and any other
stream implementing the Print interface. Think Ethernet or SD card.
2022-06-14 09:20:04 -04:00
```cpp
UUID uuid;
Serial.println(uuid);
2023-02-02 08:42:13 -05:00
// gives same output as
2022-06-15 01:34:09 -04:00
Serial.println(uuid.toCharArray());
```
2022-06-14 09:20:04 -04:00
2022-06-15 01:34:09 -04:00
## Performance
2022-06-14 09:20:04 -04:00
2022-06-15 04:31:57 -04:00
Performance measured with **UUID_test.ino** shows the following times:
2022-06-15 01:34:09 -04:00
2022-06-14 09:20:04 -04:00
2022-06-16 03:37:59 -04:00
#### microseconds per byte
2022-11-27 03:39:34 -05:00
| Version | Function | UNO 16 MHz | ESP32 240 MHz |
|:---------:|:--------------|:------------:|:---------------:|
| 0.1.0 | seed | 4 us | |
| 0.1.0 | generate | 412 us | |
| 0.1.0 | toCharArray | 4 us | |
| 0.1.1 | seed | 4 us | |
| 0.1.1 | generate | 248 us | |
| 0.1.1 | toCharArray | 4 us | |
| 0.1.2 | generate | 156 us | |
| 0.1.3 | generate | 120 us | |
2023-02-02 08:42:13 -05:00
| - | - | | |
2022-11-27 03:39:34 -05:00
| 0.1.4 | seed | 4 us | 3 us |
| 0.1.4 | generate | 120 us | 14 us |
| 0.1.4 | toCharArray | 4 us | 0 us |
2023-02-02 08:42:13 -05:00
| 0.1.5 | seed | 4 us | 4 us |
| 0.1.5 | generate | 120 us | 15 us |
| 0.1.5 | toCharArray | 4 us | 1 us |
2022-06-15 04:31:57 -04:00
2022-11-27 03:39:34 -05:00
Note: generating the 16 random bytes already takes ~40 us (UNO).
2022-06-15 01:34:09 -04:00
2022-06-14 09:20:04 -04:00
2022-06-16 03:37:59 -04:00
#### UUID's per second
2022-06-14 09:20:04 -04:00
2022-11-27 03:39:34 -05:00
indicative maximum performance (see example sketch)
2022-06-15 04:31:57 -04:00
2022-11-27 03:39:34 -05:00
| Version | UNO 16 MHz | ESP32 240 MHz | notes |
|:---------:|:------------:|:---------------:|:-----------:|
| 0.1.0 | 2000++ | | both modi |
| 0.1.1 | 4000++ | | both modi |
| 0.1.2 | 6400++ | | both modi |
| 0.1.3 | 8200++ | | both modi |
| | | | |
| 0.1.4 | 8268 | 31970 | VARIANT4 |
| 0.1.4 | 8418 | 34687 | RANDOM |
2023-02-02 08:42:13 -05:00
| 0.1.5 | 8268 | 31969 | VARIANT4 |
| 0.1.5 | 8418 | 34689 | RANDOM |
2022-06-14 09:20:04 -04:00
2022-11-27 03:39:34 -05:00
Note that these maxima are not realistic e.g. for a server.
Other tasks need to be done too (listening, transfer etc.).
2022-06-14 09:20:04 -04:00
## Future
2023-02-02 08:42:13 -05:00
#### Must
2022-06-14 09:20:04 -04:00
- improve documentation
2022-06-15 01:34:09 -04:00
- background
2022-06-14 09:20:04 -04:00
- test other platforms
2023-02-02 08:42:13 -05:00
#### Should
- optimize
- reduce footprint
- can the buffer be reduced?
- buffer as static char in generate is ~2% faster on AVR
(not shocking, impact ?)
- smaller / faster random generator?
#### Could
2022-06-14 09:20:04 -04:00
- investigate entropy harvesting
2023-02-02 08:42:13 -05:00
- micros() between calls.
- freeRAM, timers, RAM, USB-ID, ...
2022-06-15 04:31:57 -04:00
- compile constants __DATE__ and __TIME__
2022-11-27 03:39:34 -05:00
- see example
2023-02-02 08:42:13 -05:00
- auto reseed function?
- e.g. micros() between calls.
2022-06-15 01:34:09 -04:00
- GUID as derived class?
- (further identical?)
2022-06-14 09:20:04 -04:00
- add **setUpperCase()** and **setLowerCase()**, **isUpperCase()**
- one bool flag
2022-06-15 01:34:09 -04:00
- binary output in a byte array
- **getBinary(uint8_t \* array)**
- need to store them from generate.
2023-02-02 08:42:13 -05:00
- add examples
- ESP32 UUID server => using timing of the calls as entropy !
- RTC for entropy
- EEPROM to store last seeds? (n)
2022-06-15 01:34:09 -04:00
2022-06-14 09:20:04 -04:00
2022-06-15 01:34:09 -04:00
### Won't
- support for { and }
- add **setSeparator(char)** and **getSeparator()** ?
2023-02-02 08:42:13 -05:00
- minus is the RFC specification.
- move code to .h so compiler can optimize more?
- **next()** add 1 to UUID to generate a continuous sequence ?
2022-06-15 01:34:09 -04:00