为测试生成有效的、确定性的 UUID

ber*_*kes 3 ruby uuid deterministic

对于我的 ruby​​ 测试套件,我需要可预测的 UUID。我知道 UUID 本质上是随机和非确定性的,这很好。但是在测试套件中,拥有可以通过夹具、数据助手、种子等重复使用的 UUID 会很有用。

我现在有一个简单的实现,很容易导致无效的 UUID:

def fake_uuid(character = "x")
  [8, 4, 4, 4, 12].map { |length| character * length }.join("-")
end

fake_uuid('a') => "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # This is valid
fake_uuid('z') => "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz" # This is invalid, not hex.
Run Code Online (Sandbox Code Playgroud)

显然,我可以添加只允许 af,0-9 作为输入的检查。另一种方法是对预先生成的 UUID 列表进行硬编码,然后根据参数选择一个。

但我想知道,没有更好的方法吗?UUIDv5 会为此工作吗?有没有办法调用SecureRandom.uuid让它返回相同的 UUID(对于线程或会话)?它需要额外的宝石吗?或者我的方法是最接近的方法吗?

让它由所有相同的字符组成不是必需的。
让它具有一定的可读性是一个很大的优点,但不是必需的。这样,您可以例如确保 aCompany具有 UUIDcccccccc-cccc-cccc-cccc-cccccccccccc及其EmployeeUUID eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee

Jör*_*tag 5

我知道 UUID 本质上是随机和非确定性的,这很好。

这种假设是错误的。

UUID 有 5 个版本:

  • 版本 1 和 2 基于 MAC 地址和日期时间,因此在理论上它会在同一时间在同一台计算机上提供相同的 UUID,因此具有确定性。
  • 版本 3 和 5 基于命名空间和名称,因此是完全确定的。
  • 版本 4 是随机的。

因此,如果您使用版本 3 或版本 5 UUID,它们将是完全确定的。