使用 uuid id 生成器的 Grails:不是很随机
Grails using uuid id generator: Not very random
一个简单的 Grails 4 应用程序使用 uuid
id 生成器和 Hibernate 7.0.4 插件以及 Ubuntu 20.04 下的 PostgreSQL 10。这是创建 4 个实例后的一些输出:
=> select id,ttag,name from msg_template;
id | ttag | name
----------------------------------+------+-----------------
ff808181781632030178163215190000 | publ | Notice01
ff8081817816320301781632151f0001 | publ | Notice02
ff808181781632030178163215230002 | publ | Signing01
ff8081817816320301781635161b0003 | acme | Some thingy!
我的假设是 uuid = 随机性,但这个结果非常不随机。随机性不是可以期待的吗?
UUID 有不同的版本和变体,请参阅 https://en.wikipedia.org/wiki/Universally_unique_identifier。并非每个版本都会生成随机值。
但是,版本 4 基于随机数生成器生成随机值。
对于Java,随机数生成器可以通过系统属性java.security.egd更精确的定义,参见https://www.baeldung.com/java-security-egd.
使用 java.util.UUID.randomUUID() 生成版本 4 的 UUID。
对于 Hibernate 有不同的方式使用 UUID,这里
- https://thorben-janssen.com/generate-uuids-primary-keys-hibernate/
- https://vladmihalcea.com/hibernate-and-uuid-identifiers/
可以提供帮助。
一个简单的 Grails 4 应用程序使用 uuid
id 生成器和 Hibernate 7.0.4 插件以及 Ubuntu 20.04 下的 PostgreSQL 10。这是创建 4 个实例后的一些输出:
=> select id,ttag,name from msg_template;
id | ttag | name
----------------------------------+------+-----------------
ff808181781632030178163215190000 | publ | Notice01
ff8081817816320301781632151f0001 | publ | Notice02
ff808181781632030178163215230002 | publ | Signing01
ff8081817816320301781635161b0003 | acme | Some thingy!
我的假设是 uuid = 随机性,但这个结果非常不随机。随机性不是可以期待的吗?
UUID 有不同的版本和变体,请参阅 https://en.wikipedia.org/wiki/Universally_unique_identifier。并非每个版本都会生成随机值。
但是,版本 4 基于随机数生成器生成随机值。
对于Java,随机数生成器可以通过系统属性java.security.egd更精确的定义,参见https://www.baeldung.com/java-security-egd.
使用 java.util.UUID.randomUUID() 生成版本 4 的 UUID。
对于 Hibernate 有不同的方式使用 UUID,这里
- https://thorben-janssen.com/generate-uuids-primary-keys-hibernate/
- https://vladmihalcea.com/hibernate-and-uuid-identifiers/
可以提供帮助。