30

What is the difference between the following two functions

Are they both the same behind the scenes? Any performance impacts on using one?

Evan Carroll
  • 63,051
  • 46
  • 242
  • 479

1 Answers1

32

Are they the same?

No.

The Postgres documetation for uuid-ossp suggests using gen_random_uuid() If you only need randomly-generated (version 4) UUIDs,

The uuid-ossp extension also provides other types of UUID (such as mac-addresses based)

The difference?

I looked at the source and discovered that

  • uuid_generate_v4() uses arc4random to determine the random part.

  • gen_random_uuid() uses fortuna instead.

Other than that they do the same job.

Notes:

  • gen_random_uuid() from the pgcrypto module is now deprecated, because it is natively part of PostgreSQL (since PostgreSQL version 13).
  • uuid_generate_v4() still requires the uuid-ossp module.
Adrian B.
  • 135
  • 5
Jasen
  • 3,563
  • 1
  • 13
  • 17
  • 5
    arc4random vs. fortuna, why should you care? As best I can tell arc4random could have some vulnerabilities. Fortuna appears to be more secure. https://en.wikipedia.org/wiki/Fortuna_(PRNG) https://en.wikipedia.org/wiki/RC4#RC4-based_random_number_generators https://security.stackexchange.com/questions/85601/is-arc4random-secure-enough/172905#172905 – HairOfTheDog Jun 25 '21 at 02:54
  • About the performance impact: by a simple test (on PG 15.3), it looks like gen_random_uuid is more than twice as fast. On an empty CREATE TEMPORARY TABLE uuidv4 (id uuid), an INSERT INTO uuidv4 SELECT gen_func() FROM generate_series(1, 1000000) took 1 s 192 ms for gen_func = gen_random_uuid, and 2 s 614 ms for uuid_generate_v4. – Eemeli Kantola Aug 04 '23 at 06:34