From d2f528578caab1d9ec14ef0834dfd74ae0084d9f Mon Sep 17 00:00:00 2001 From: Vito Date: Mon, 27 Nov 2023 22:15:15 -0500 Subject: [PATCH] add uuid4_seeded --- lib/uuid.ex | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/uuid.ex b/lib/uuid.ex index e651e78..ebd1349 100644 --- a/lib/uuid.ex +++ b/lib/uuid.ex @@ -385,6 +385,27 @@ defmodule UUID do |> uuid_to_string(format) end + @doc """ + Generate a UUID v4 from a PRNG seed using the `rand` module. + This is useful if you want your UUIDs to + not necessarily be universally unique. + + ## Examples + + ```elixir + iex> seed = :rand.seed_s(:exsss, 0) + iex> {_updated_seed, uuid} = UUID.uuid4_seeded(seed) + iex> uuid + "7b17cdb2-dd7c-484d-9d77-42e52d99f72e" + ``` + """ + @spec uuid4_seeded(:rand.state()) :: {:rand.state, String.t()} + def uuid4_seeded(seed) do + {<>, seed} = :rand.bytes_s(16, seed) + {seed, <> + |> uuid_to_string(:default)} + end + @doc """ Generate a new UUID v5. This version uses an SHA1 hash of fixed value (chosen based on a namespace atom - see Appendix C of @@ -618,7 +639,7 @@ defmodule UUID do defp variant(_) do raise ArgumentError, message: "Invalid argument; Not valid variant bits" end - + defp hex_str_to_binary(<< a1, a2, a3, a4, a5, a6, a7, a8, b1, b2, b3, b4, c1, c2, c3, c4, @@ -633,7 +654,7 @@ defmodule UUID do d(e5)::4, d(e6)::4, d(e7)::4, d(e8)::4, d(e9)::4, d(e10)::4, d(e11)::4, d(e12)::4 >> end - + @compile {:inline, d: 1} defp d(?0), do: 0