Getting random seed from /dev/urandom, and falling back to time-based seed
This commit is contained in:
parent
5d28bc1365
commit
fbebe3d77e
4
Makefile
4
Makefile
|
@ -79,8 +79,8 @@ test: $(TEST)
|
|||
all: $(LIB) $(TEST)
|
||||
|
||||
clean:
|
||||
$(RM) -f support/*.gpr obj/*.* obj/test/*.* obj/debug/*.* ali/*.* ali/debug/*.* 2> /dev/null
|
||||
$(RM) -f obj/*.* obj/test/*.* obj/debug/*.* ali/*.* ali/debug/*.* 2> /dev/null
|
||||
|
||||
cleanall: clean
|
||||
$(RM) -f bin/* lib/* 2> /dev/null
|
||||
$(RM) -f support/*.gpr bin/* lib/* 2> /dev/null
|
||||
|
||||
|
|
|
@ -6,14 +6,39 @@
|
|||
|
||||
with SHA.Process_Data; -- For From_Name
|
||||
with Ada.Numerics.Discrete_Random; -- For RNG
|
||||
with Ada.Streams.Stream_IO; -- For reading from /dev/random
|
||||
use Ada.Streams.Stream_IO;
|
||||
|
||||
package body AdaID.Generate is
|
||||
|
||||
-- For RNG
|
||||
package RNG is new Ada.Numerics.Discrete_Random(Result_Subtype => Unsigned_32);
|
||||
package RNG is new Ada.Numerics.Discrete_Random(Result_Subtype =>
|
||||
Unsigned_32);
|
||||
generator: RNG.Generator;
|
||||
generator_is_set: Boolean := false;
|
||||
|
||||
|
||||
procedure Seed_RNG is
|
||||
seed : Integer;
|
||||
file : File_Type;
|
||||
begin
|
||||
-- Set up the generator first time
|
||||
if not generator_is_set then
|
||||
begin
|
||||
Open (File => file,
|
||||
Mode => In_File,
|
||||
Name => "/dev/urandom");
|
||||
Integer'Read (Stream(file), seed);
|
||||
Close(file);
|
||||
RNG.Reset(generator, seed);
|
||||
exception
|
||||
when others =>
|
||||
RNG.Reset(generator); -- Fallback to time-based
|
||||
end;
|
||||
generator_is_set := true;
|
||||
end if;
|
||||
end Seed_RNG;
|
||||
|
||||
|
||||
--Reset a UUID to Nil
|
||||
procedure Nil(id : in out UUID) is
|
||||
|
@ -27,11 +52,8 @@ package body AdaID.Generate is
|
|||
rand : Unsigned_32;
|
||||
x : Integer := 0;
|
||||
begin
|
||||
-- Set up the generator first time
|
||||
if not generator_is_set then
|
||||
RNG.Reset(generator);
|
||||
generator_is_set := true;
|
||||
end if;
|
||||
-- Ensure RNG is seeded
|
||||
Seed_RNG;
|
||||
|
||||
-- Get a random number
|
||||
rand := RNG.Random(generator);
|
||||
|
|
Loading…
Reference in New Issue