generate_uuid Function

public function generate_uuid()

Uses

Generate a version 4 UUID using either the libuuid library, or our own random number generator wrapper

Arguments

None

Return Value character(len=uuid_len)


Contents

Source Code


Source Code

  function generate_uuid()
#if !GK_HAS_LIBUUID
    use mt19937, only: mt19937_type
#endif
    character(len=uuid_len) :: generate_uuid
    integer(c_signed_char), dimension(16) :: uuid_version_4

#if GK_HAS_LIBUUID
    ! Use a wrapper for the C library libuuid
    interface
      subroutine uuid_generate_c(uuid_out) bind(C, name="uuid_generate")
        import
        integer(c_signed_char), dimension(16) :: uuid_out
      end subroutine uuid_generate_c
    end interface

    call uuid_generate_c(uuid_version_4)
#else
    type(mt19937_type) :: prng
    integer :: i

    ! Always re-start the PRNG
    call prng%set_seed(get_random_seed())

    ! Generate random numbers between 0 and 255
    do i = 1, size(uuid_version_4)
      uuid_version_4(i) = int(prng%generate() * huge(uuid_version_4), kind=c_signed_char)
    end do

    ! Version must be 0100xxxx (i.e. 0x4X)
    uuid_version_4(7) = iand(uuid_version_4(7), 79_c_signed_char)
    uuid_version_4(7) = ior(uuid_version_4(7), 64_c_signed_char)

    ! Variant must be 10xxxxxx (i.e 0x8X - 0xBX)
    uuid_version_4(9) = iand(uuid_version_4(9), -65_c_signed_char)
    uuid_version_4(9) = ior(uuid_version_4(9), -127_c_signed_char)
#endif
    generate_uuid = format_uuid(uuid_version_4)
  end function generate_uuid