Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

We often need to generate unique identifiers for various purposes in our applications. One commonly used method for generating unique identifiers is the Universally Unique Identifier (UUID).

In this tutorial, we’ll explore how to generate the same UUID from a string in Java.

2. Introduction to the Problem

There could be two scenarios when we talk about generating UUID from a string:

  • Scenario 1 – The input string is in the standard UUID string format.
  • Scenario 2 – The given string is a free-form string.

Next, we’ll take a closer look at how to generate a UUID object from a string. Of course, we’ll cover both scenarios.

For simplicity, we’ll use unit test assertions to verify whether each approach can produce the expected results.

3. The Given String Is a Standard UUID Representation

The standard UUID string format consists of five groups of hexadecimal digits separated by hyphens, for example:

String inputStr = "bbcc4621-d88f-4a94-ae2f-b38072bf5087";

In this scenario, we want to get a UUID object from the given string. Moreover, the generated UUID object’s string representation must equal the input string. In other words, it means generatedUUID.toString() is the same as the input string.

So, precisely speaking, we want to “parse” the input string in the standard UUID format and construct a new UUID object based on the parsed values.

To achieve that, we can use the UUID.fromString() method. Next, let’s write a test to see how it works:

String inputStr = "bbcc4621-d88f-4a94-ae2f-b38072bf5087";

UUID uuid = UUID.fromString(inputStr);
UUID uuid2 = UUID.fromString(inputStr);
UUID uuid3 = UUID.fromString(inputStr);

assertEquals(inputStr, uuid.toString());

assertEquals(uuid, uuid2);
assertEquals(uuid, uuid3);

As the test above shows, we simply called UUID.fromString(inputStr) to generate the UUID object. The standard UUID class takes care of the input parsing and the UUID generation.

Further, in our test, we generated multiple UUID objects from the same input string, and it turns out that all UUID objects generated by the input string are equal.

Using the UUID.fromString() method is convenient. However, it’s worth mentioning that the input string must be in the standard UUID format. Otherwise, the method will throw IllegalArgumentException:

String inputStr = "I am not a standard UUID representation.";
assertThrows(IllegalArgumentException.class, () -> UUID.fromString(inputStr));

4. The Given Input Is a Free-form String

We’ve seen UUID.fromString() can conveniently construct a UUID object from a standard UUID format string. Let’s see how to generate a UUID object from a free-form string.

The UUID class offers us the nameUUIDFromBytes(byte[] name) method to construct a version 3 (also known as name-based) UUID object. 

As the method only accepts byte array (byte[]), we need to convert the input string to a byte array to use UUID.nameUUIDFromBytes():

String inputStr = "I am not a standard UUID representation.";

UUID uuid = UUID.nameUUIDFromBytes(inputStr.getBytes());
UUID uuid2 = UUID.nameUUIDFromBytes(inputStr.getBytes());
UUID uuid3 = UUID.nameUUIDFromBytes(inputStr.getBytes());

assertTrue(uuid != null);

assertEquals(uuid, uuid2);
assertEquals(uuid, uuid3);

As we can see in the test above, we generated three UUID objects by calling UUID.nameUUIDFromBytes() three times with the same input string, and these three UUIDs are equal to each other.

Internally, this method returns a UUID object based on the MD5 hash of the input byte array. Thus, the resulting UUID is guaranteed to be unique for a given input name.

Moreover, it’s worth mentioning that the UUID objects generated by the UUID.nameUUIDFromBytes() method are version 3 UUIDs. We can verify it with the version() method:

UUID uuid = UUID.nameUUIDFromBytes(inputStr.getBytes());
...
assertEquals(3, uuid.version());

Version 5 UUID uses the SHA-1 (160 bits) hashing function instead of MD5. If a version 5 UUID is required, we can directly use the generateType5UUID(String name) method that we created when we introduced Versions 3 and 5 UUIDs:

String inputStr = "I am not a standard UUID representation.";

UUID uuid = UUIDGenerator.generateType5UUID(inputStr);
UUID uuid2 = UUIDGenerator.generateType5UUID(inputStr);
UUID uuid3 = UUIDGenerator.generateType5UUID(inputStr);

assertEquals(5, uuid.version());

assertTrue(uuid != null);

assertEquals(uuid, uuid2);
assertEquals(uuid, uuid3);

5. Conclusion

In this article, we’ve explored how to generate the same UUID objects from a string. We’ve covered two scenarios depending on the input formats:

  • Standard UUID format string – using UUID.fromString()
  • Free-form string – using UUID.nameUUIDFromBytes()

As usual, all code snippets presented here are available over on GitHub.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.