Generate a version 4 UUID using either the libuuid library, or our own random number generator wrapper
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