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

207 lines
7.1 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)
2023-11-23 08:08:41 -05:00
[![GitHub issues](https://img.shields.io/github/issues/RobTillaart/UUID.svg)](https://github.com/RobTillaart/UUID/issues)
2022-06-14 09:20:04 -04:00
[![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)
2023-11-23 08:08:41 -05:00
[![PlatformIO Registry](https://badges.registry.platformio.org/packages/robtillaart/library/UUID.svg)](https://registry.platformio.org/libraries/robtillaart/UUID)
2022-06-14 09:20:04 -04:00
# 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
### 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
2023-11-23 08:08:41 -05:00
## Support
If you appreciate my libraries, you can support the development and maintenance.
Improve the quality of the libraries by providing issues and Pull Requests, or
donate through PayPal or GitHub sponsors.
Thank you,