Generating Unique Id's
UUID:
- Universally Unique Identifiers
Question:
- What is UUID?
Answer:- A
class that represents an immutable universally unique identifier (UUID). A UUID
represents a 128-bit value. The UUID is generated using a cryptographically
strong pseudo random number generator. A UUID is a 16-octet (128-bit) number.
In its canonical form, a UUID is represented by 32 hexadecimal digits,
displayed in five groups separated by hyphens, in the form 8-4-4-4-12 for a total of 36
characters (32 alphanumeric characters and four hyphens) or 2 128 .
For
example: 550e8400-e29b-41d4-a716-446655440000
Java UUID Generator also provides a good
quality UUID generator. It can generate UUID's using method 1 (MAC address +
time) which is good if we need further assurance that UUID's are unique between
multiple machines. It includes a JNI library to retrieve the MAC address or a
mechanism to specify/generate a random MAC.
The UUID algorithm was intended
to be globally unique across all time by including a network address in
conjunction with a time stamp. The intent of UUIDs is to enable distributed
systems to uniquely identify information without significant central
coordination
UUID
specification has five versions:-
Concatenation
of the UUID version with the MAC address of the computer that is generating the
UUID
Question:-
Why UUID is required?
Answer:- Below
are the cases for that we can go for UUID generation:-
- Suppose I would like to use a cryptographically secure primary key for sensitive data in a database - this cannot be predictable and it cannot be generated by the database means I needs that key before the object is saved in the database.
- Suppose I am working on a distributed application and during sending some data, we have to send some unique identifiers which should be unique for multiple machines.
- Suppose during transaction, we want to produce some unique identifiers in order to validate transactions.
- Another typical example is the value of a cookie used as a session identifier - simply using a series of consecutive integers is generally unacceptable, since one user could easily impersonate another by altering the value of the cookie to some nearby integer.
- Digital imaging and communication in medicine (DICOM) specifies that all DICOM objects have globally unique identifiers (UIDs). So to fulfill these scenario we can use UUID generator.
- At last the conclusion is Some of UUID usage are for creating random file names, session id in web application, transaction id and for record’s primary keys in database replacing the sequence or auto generated number.
Famous Globally Unique Identifier
generation techniques are as below:-
Technique 1 – Using UUID
When
Java 5 is available, the UUID class provides a simple means for generating
unique ids. The identifiers generated by UUID are actually universally
unique identifiers.
package com.gaurav.uuid;
import java.util.UUID;
public class
UUIDGeneratorFirstTechnique {
public
static final void main(String... args) {
//
generate random UUIDs
UUID
generatedUniqueID = UUID.randomUUID();
captureLogEvent(
"GENERATED
UNIQUE IDENTIFIER IS : " + generatedUniqueID,
generatedUniqueID);
final
String generatedUUIDWithoutHyphen = UUID.randomUUID().toString()
.replaceAll("-",
"");
System.out.println("GENERATED
UUID WITHOUT HYPHEN : "
+
generatedUUIDWithoutHyphen);
}
private
static void captureLogEvent(Object aObject, UUID uuid) {
System.out.println(String.valueOf(aObject));
System.out.println("GENERATED
UUID VERSION = " +
uuid.version());
System.out.println("GENERATED
UUID VARIANT = " +
uuid.variant());
}
}
Result:-
GENERATED UNIQUE IDENTIFIER IS :
ec24e9b6-16e8-4075-a005-645ce224f864
GENERATED UUID VERSION = 4
GENERATED UUID VARIANT = 2
GENERATED UUID WITHOUT HYPHEN : 23afbb1baba54a3082bd990d979b51a8
Technique 2 – Using SecureRandom and MessageDigest
The
following program uses SecureRandom and MessageDigest Classes to generate
the UUID:
- During startup needs to initialize SecureRandom.
- when a new identifier is needed, generate a random number using SecureRandom class object
- create a MessageDigest class object of the random number
- encode the byte[] returned by the MessageDigest into some acceptable textual form
- check if the result is already being used ; if it is not already taken, it is suitable as a unique identifier
The MessageDigest class is suitable for generating a "one-way hash" of arbitrary data. A MessageDigest takes any input, and produces a String which :
- is of fixed length
- MessageDigest does not allow the original input to be easily recovered it's completely difficult.
- MessageDigest does not uniquely identify the input, however similar input will produce dissimilar message digests
- MessageDigest can be used as a checksum, for verifying that data has not been altered since its creation.
Example to generate using SecureRandom and MessageDigest
package com.gaurav.uuid;
import
java.security.MessageDigest;
import
java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class
UUIDGeneratorSecondTechnique {
public
static void main(String... args) {
try
{
/**
* Initializing SecureRandom class, This is a
lengthy process so it
* should be initialized only upon
initialization of the application
*/
SecureRandom
secureRandomObject = SecureRandom
.getInstance("SHA1PRNG");
/**
generating a random number using SecureRandom */
String
randomNum = new Integer(secureRandomObject.nextInt())
.toString();
/**
generating a random number using MessageDigest */
MessageDigest
messageDigestObject = MessageDigest
.getInstance("SHA-1");
byte[]
resultArray = messageDigestObject.digest(randomNum
.getBytes());
System.out.println("Random
number Generated Using SecureRandom object : " + randomNum);
System.out.println("Random
number Generated Using Message digest object: " + hexadecimalEncode(resultArray));
}
catch (NoSuchAlgorithmException ex) {
System.err.println(ex);
}
}
/**
*
* This converts a byte array into a String of
hex characters.
*
*/
private static
String hexadecimalEncode(byte[] inputDataArray) {
StringBuilder
stringBuilderObject = new StringBuilder();
char[]
digitsInCharArray = { '0', '1', '2', '3', '4', '5', '6', '7',
'8',
'9', 'a', 'b', 'c', 'd', 'e', 'f' };
for
(int index = 0; index < inputDataArray.length; ++index) {
byte
byteData = inputDataArray[index];
stringBuilderObject
.append(digitsInCharArray[(byteData
& 0xf0) >> 4]);
stringBuilderObject.append(digitsInCharArray[byteData
& 0x0f]);
}
return
stringBuilderObject.toString();
}
}
Result:-
Random number Generated Using
SecureRandom object : -992077914
Random number Generated Using Message digest object:
7384973fc0e0a1c8cf6c53c27384e5e94869dfb2
No comments:
Post a Comment