Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Algorithm for generating a unique ID in C++?

What can be the best algorithm to generate a unique id in C++? The length ID should be a 32 bit unsigned integer.

like image 703
Ajay Avatar asked Jan 01 '10 14:01

Ajay


People also ask

How are unique IDs generated?

Version-1 UUIDs are generated from a time and a node ID (usually the MAC address); version-2 UUIDs are generated from an identifier (usually a group or user ID), time, and a node ID; versions 3 and 5 produce deterministic UUIDs generated by hashing a namespace identifier and name; and version-4 UUIDs are generated ...

How do you generate unique numbers in C++?

One way to generate these numbers in C++ is to use the function rand(). Rand is defined as: #include <cstdlib> int rand(); The rand function takes no arguments and returns an integer that is a pseudo-random number between 0 and RAND_MAX.

How do I generate a CPP ID?

You can use a static variable when you create a patient (if you want it there) that increment itself in the constructor, or a variable in you're queue that increment when you add a patient (if you want to only assign an ID when in the queue).

What is the unique ID column for?

UNIQUEID("UUID") generates a version 4 universally-unique identifier (UUID), a sequence of random digits and letters suitable for use as a unique identifier. While the generated ID is not guaranteed to be unique, it is sufficiently random as to be effectively unique for all purposes.


2 Answers

Getting a unique 32-bit ID is intuitively simple: the next one. Works 4 billion times. Unique for 136 years if you need one a second. The devil is in the detail: what was the previous one? You need a reliable way to persist the last used value and an atomic way to update it.

How hard that will be depends on the scope of the ID. If it is one thread in one process then you only need a file. If it is multiple threads in one process then you need a file and a mutex. If is multiple processes on one machine then you need a file and a named mutex. If it is multiple processes on multiple machines then you need to assign a authoritative ID provider, a single server that all machines talk to. A database engine is a common provider like that, they have this built-in as a feature, an auto-increment column.

The expense of getting the ID goes progressively up as the scope widens. When it becomes impractical, scope is Internet or provider too slow or unavailable then you need to give up on a 32-bit value. Switch to a random value. One that's random enough to make the likelihood that the machine is struck by a meteor is at least a million times more likely than repeating the same ID. A goo-ID. It is only 4 times as large.

like image 194
Hans Passant Avatar answered Oct 12 '22 02:10

Hans Passant


Here's the simplest ID I can think of.

MyObject obj; uint32_t id = reinterpret_cast<uint32_t>(&obj); 

At any given time, this ID will be unique across the application. No other object will be located at the same address. Of course, if you restart the application, the object may be assigned a new ID. And once the object's lifetime ends, another object may be assigned the same ID.

And objects in different memory spaces (say, on different computers) may be assigned identical IDs.

And last but not least, if the pointer size is larger than 32 bits, the mapping will not be unique.

But since we know nothing about what kind of ID you want, and how unique it should be, this seems as good an answer as any.

like image 21
jalf Avatar answered Oct 12 '22 02:10

jalf