GithubHelp home page GithubHelp logo

konajugames / uuid_v4 Goto Github PK

View Code? Open in Web Editor NEW

This project forked from crashoz/uuid_v4

0.0 2.0 0.0 20 KB

Super fast C++ library to generate and parse UUIDv4

License: MIT License

CMake 6.15% C++ 74.24% C 19.61%

uuid_v4's Introduction

uuid_v4

This is a fast C++ header-only library to generate, serialize, print and parse UUIDs version 4 variant 1 as specified in RFC-4122. It heavily relies on SIMD operations (instruction sets SSE4.1/AVX/AVX2), c++11 PRNG library and some c++17 features.

This library generates UUIDs with pseudo-random numbers, seeded by true (hardware) random. It is not a cryptographically secure way of generating UUIDs.

Usage

Include "uuid_v4.h" and "endianness.h". To start generating UUIDs you need to create an object UUID::UUIDGenerator<random_generator> where random_generator is a c++11 Random number engine (see random). It is highly recommended to use the default engine std::mt19937_64 as it has a SIMD implementation (at least in libstdc++) and provides better randomness.

#include "uuid_v4"
UUID::UUIDGenerator<std::mt19937_64> uuidGenerator;
UUID::UUID uuid = uuidGenerator.getUUID();

Serializing an UUID to a byte string (16 bytes)

std::string bytes = uuid.bytes();
or
std::string bytes1;
uuid.bytes(bytes1);
or
char bytes2[16];
uuid.bytes(bytes2);

Pretty-printing an UUID (36 bytes)

std::string s = uuid.str();
or
std::string s1;
uuid.str(s1);
or
char s2[36];
uuid.bytes(s2);

Loading an UUID from a byte string (16 bytes)

UUID::UUID uuid(bytes);

Parsing an UUID from a pretty string (36 bytes)

UUID::UUID uuid = UUID::UUID::fromStrFactory(string);
or
UUID::UUID uuid;
uuid.fromStr(string);

Comparing UUIDs

UUID::UUIDGenerator<std::mt19937_64> uuidGenerator;
UUID::UUID uuid1 = uuidGenerator.getUUID();
UUID::UUID uuid2 = uuidGenerator.getUUID();
if (uuid1 == uuid2) {
  std::cout << "1 in 10^36 chances of this printing" << std::endl
}

stream operations

std::cout << uuid << std::endl;
std::cin >> uuid;

Benchmarks

Comparing generation time

  • Basic approach generating directly a string basic
  • libuuid libuuid uses /dev/urandom (cryptographically secure)
  • Boost UUID boost uses /dev/urandom (cryptographically secure)
  • Boost UUID with mt19937_64
  • UUID_v4 (this project)
Benchmark Time CPU Iterations
Basic 16098 ns 16021 ns 42807
Libuuid 298655 ns 293749 ns 2405
BoostUUID 48476 ns 48357 ns 14689
BoostUUIDmt19937 2673 ns 2665 ns 262395
UUID_v4 1117 ns 1114 ns 618670

Timings of UUIDs operations, there is a scale factor on x100. i.e UUIDGeneration takes 11.34ns to build one uuid.

Benchmark Time CPU Iterations
UUIDGeneration 1134 ns 1117 ns 618589
UUIDSerializeAlloc 3197 ns 3182 ns 214742
UUIDSerializeByRef 211 ns 211 ns 3312380
UUIDSerializeCharArray 64 ns 64 ns 10747617
UUIDPretty 3424 ns 3415 ns 206672
UUIDPrettyByRef 211 ns 209 ns 3319069
UUIDPrettyCharArray 88 ns 88 ns 7916795
UUIDLoad 64 ns 63 ns 10837304
UUIDParse 320 ns 316 ns 2206306
UUIDParseInPlace 317 ns 313 ns 2222561
UUIDEqual 50 ns 49 ns 12978765
UUIDCompare 65 ns 65 ns 10672186

Building

This project uses CMake to build tests and benchmarks. If you do not have googletest and googlebenchmark installed globally

git clone --recurse-submodules https://github.com/crashoz/uuid_v4.git

otherwise

git clone https://github.com/crashoz/uuid_v4.git

Then build

mkdir build
cd build
cmake -Dtest=ON -Dbenchmark=ON ..
make
./tests/uuid_v4_test
./benchmarks/uuid_v4_benchmark

uuid_v4's People

Contributors

crashoz avatar omegacoleman avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.