随机uuid4的mysql表达式?

随机uuid4的mysql表达式?,mysql,random,cryptography,guid,Mysql,Random,Cryptography,Guid,Mysql提供了一个UUID()函数, 它返回一个版本1 guid。 这是一个容易猜测的时间戳+节点id位字符串 我们如何插入随机化的guid (定义新函数需要权限,超出范围。 Ben Johnson提供了一个非常好但有点冗长的字符串。)这将插入一个版本4的随机字符串,没有破折号。 为了简洁起见,它使用了略微减少的密钥空间, 只有120位。 (因此8位是可预测的,它们是常量。) -- Produces version 4 guids for mysql, as its UUID() only o

Mysql提供了一个
UUID()
函数, 它返回一个版本1 guid。 这是一个容易猜测的时间戳+节点id位字符串

我们如何插入随机化的guid

(定义新函数需要权限,超出范围。
Ben Johnson提供了一个非常好但有点冗长的字符串。)

这将插入一个版本4的随机字符串,没有破折号。 为了简洁起见,它使用了略微减少的密钥空间, 只有120位。 (因此8位是可预测的,它们是常量。)

-- Produces version 4 guids for mysql, as its UUID() only offers version 1.
--
-- See https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random)
-- We consider variant 1 only, ignoring the Microsoft proprietary variant 2.
-- Version 1 is predictable timestamp.
-- Version 4 is 122 random bits + 6 constant bits.
--
-- The nil guid comes out like this:
-- UUID('00000000-0000-4000-8000-000000000000')  # 8-4-4-4-12
-- The nybble '4' is constant version.
-- The nybble '8' has hi bit set, next bit cleared, plus two wasted bits.
-- We deliberately choose to emit just 120 random bits, for simplicity.
-- The RAND() function returns about 53 bits of entropy in the mantissa,
-- so for 15 nybbles we call it twice to obtain 106 ( > 60 ) unguessable bits.
-- The standard spelling of a guid, with four '-' dashes, is 36 characters.
-- We emit 32 hex characters, sans dashes.

INSERT INTO guid_test (guid) VALUES (
  concat(substr(sha2(rand(), 256),                 1, 12),
    '4', substr(sha2(rand(), 256),                 1,  3),
    '8', substr(sha2(concat(rand(), rand()), 256), 1, 15)
  )
);