Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-05 Thread Thaddy de Koning
 Why can't FPC automatically call randomize() in the RTL. Put it in
 some initialization section. That way, at application startup,
 randomize() is already called and only Random() needs to be used?

Please not! This would hamper all kinds of scientific, statistical and
financial modelling. For all those (and more) it is sometimes necessary to
have a *reproducable* random distribution.
There's more to random than random ;-)

___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-02 Thread Graeme Geldenhuys
On 31/05/2008, Vinzent Höfler [EMAIL PROTECTED] wrote:
 
  Note that random() will always return the same sequence if you don't call
 randomize() once in the program.
 

  Yes. But don't make the mistake to call it more than once.

Why can't FPC automatically call randomize() in the RTL. Put it in
some initialization section. That way, at application startup,
randomize() is already called and only Random() needs to be used?

I could never figure out why this wasn't done in Delphi either?  After
all, if you use Random(), you want something random, yet many
developers make the common mistakes of not calling Randomize() or
calling it to often.  If FPC handled that for us, nobody would every
make those mistakes again!


Regards,
  - Graeme -


___
fpGUI - a cross-platform Free Pascal GUI toolkit
http://opensoft.homeip.net/fpgui/
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-02 Thread Marco van de Voort
[ Charset ISO-8859-1 unsupported, converting... ]
 On 31/05/2008, Vinzent H?fler [EMAIL PROTECTED] wrote:
  
   Note that random() will always return the same sequence if you don't call
  randomize() once in the program.
  
 
   Yes. But don't make the mistake to call it more than once.
 
 Why can't FPC automatically call randomize() in the RTL. Put it in
 some initialization section. That way, at application startup,
 randomize() is already called and only Random() needs to be used?

Then the whole random system is linked in, even when not used. 

Also when you would want to set a different randseed, you'd call it twice
(though I can't imagine that being such a problem nowadays)
 
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-02 Thread Florian Klaempfl

Graeme Geldenhuys schrieb:

On 31/05/2008, Vinzent Höfler [EMAIL PROTECTED] wrote:

Note that random() will always return the same sequence if you don't call

randomize() once in the program.
 Yes. But don't make the mistake to call it more than once.


Why can't FPC automatically call randomize() in the RTL. Put it in
some initialization section. That way, at application startup,
randomize() is already called and only Random() needs to be used?

I could never figure out why this wasn't done in Delphi either?  After
all, if you use Random(), you want something random, yet many
developers make the common mistakes of not calling Randomize() or
calling it to often.  If FPC handled that for us, nobody would every
make those mistakes again!


People might want to start with a defined randseed to reproduce behaviour.
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-02 Thread Jonas Maebe


On 02 Jun 2008, at 09:49, Marco van de Voort wrote:


Why can't FPC automatically call randomize() in the RTL. Put it in
some initialization section. That way, at application startup,
randomize() is already called and only Random() needs to be used?


Then the whole random system is linked in, even when not used.


Randomize only causes the randseed variable to be initialised/used.


Jonas
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-02 Thread Graeme Geldenhuys
On 02/06/2008, Marco van de Voort [EMAIL PROTECTED] wrote:

 Then the whole random system is linked in, even when not used.

I would have thought this is already linked in as part of the RTL.
Simply not initialized until the first Randomize() call.


  Also when you would want to set a different randseed, you'd call it twice
  (though I can't imagine that being such a problem nowadays)

Ok, valid point.  Even so, I still think many people use Randomize()
and Random() incorrectly which causes more harm (unexpected results)
compared to *maybe* having to set a different randseed and calling
randomize() twice.


Regards,
  - Graeme -


___
fpGUI - a cross-platform Free Pascal GUI toolkit
http://opensoft.homeip.net/fpgui/
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-02 Thread Vincent Snijders

Daniël Mantione schreef:



Op Mon, 2 Jun 2008, schreef Florian Klaempfl:


all, if you use Random(), you want something random, yet many
developers make the common mistakes of not calling Randomize() or
calling it to often.  If FPC handled that for us, nobody would every
make those mistakes again!


People might want to start with a defined randseed to reproduce 
behaviour.


This implies createguid should not call randomize automatically either, 
it prevents you having deterministic behaviour, especially in a program 
where guids and normal use of the randomizer are combined.


It is not a problem anymore. Call CreateGuid once, set the randseed and you get 
predictable guids afterwards.


Vincent
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-02 Thread Daniël Mantione



Op Mon, 2 Jun 2008, schreef Florian Klaempfl:


all, if you use Random(), you want something random, yet many
developers make the common mistakes of not calling Randomize() or
calling it to often.  If FPC handled that for us, nobody would every
make those mistakes again!


People might want to start with a defined randseed to reproduce behaviour.


This implies createguid should not call randomize automatically either, it 
prevents you having deterministic behaviour, especially in a program where 
guids and normal use of the randomizer are combined.


Daniël___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-02 Thread Michael Van Canneyt


On Mon, 2 Jun 2008, Daniël Mantione wrote:

 
 
 Op Mon, 2 Jun 2008, schreef Florian Klaempfl:
 
   all, if you use Random(), you want something random, yet many
   developers make the common mistakes of not calling Randomize() or
   calling it to often.  If FPC handled that for us, nobody would every
   make those mistakes again!
 
  People might want to start with a defined randseed to reproduce behaviour.
 
 This implies createguid should not call randomize automatically either, it
 prevents you having deterministic behaviour, especially in a program where
 guids and normal use of the randomizer are combined.

Creating GUIDs should never be deterministic.. ?

Michael.___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-02 Thread Daniël Mantione


Op Mon, 2 Jun 2008, schreef Michael Van Canneyt:


People might want to start with a defined randseed to reproduce behaviour.


This implies createguid should not call randomize automatically either, it
prevents you having deterministic behaviour, especially in a program where
guids and normal use of the randomizer are combined.


Creating GUIDs should never be deterministic.. ?


For debugging it can be usefull to have deterministic behaviour. But that 
was not the point. The point was, that a call to randomize disrupts the 
current state of the random generator. That means that if you use random 
outside guid creation, creating a guid can have unintended side effects on 
your random generation.


I agree it is nitpicking, but strictly speaking, it is a bad idea to 
automatically initialize the random generator.


Daniël___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-02 Thread Vincent Snijders

Klaus Hartnegg schreef:
a call to randomize disrupts the current state of the random 
generator. That means that if you use random outside guid creation, 
creating a guid can have unintended side effects on your random 
generation.


Maybe the GUID generator should have an automatic call to randomize,
but use its own randseed (or preserve the original value):

randseed_old := randseed;
if not guid_rnd_initialized then begin
   randomize;
   guid_rnd_initialized := true;
end
else
   randseed := guid_randseed;
result := rnd2guid(random);
guid_randseed := randseed;
randseed := randseed_old;


It is not that easy to restore the state of random number generator.

Vincent
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-02 Thread Klaus Hartnegg

On Mon, 2 Jun 2008, Daniël Mantione wrote:


Op Mon, 2 Jun 2008, schreef Michael Van Canneyt:


Creating GUIDs should never be deterministic.. ?


a call to randomize disrupts the current 
state of the random generator. That means that if you use random outside guid 
creation, creating a guid can have unintended side effects on your random 
generation.


Maybe the GUID generator should have an automatic call to randomize,
but use its own randseed (or preserve the original value):

randseed_old := randseed;
if not guid_rnd_initialized then begin
   randomize;
   guid_rnd_initialized := true;
end
else
   randseed := guid_randseed;
result := rnd2guid(random);
guid_randseed := randseed;
randseed := randseed_old;___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-06-02 Thread Vinzent Höfler

Vincent Snijders wrote:

Klaus Hartnegg schreef:
a call to randomize disrupts the current state of the random 
generator. That means that if you use random outside guid creation, 
creating a guid can have unintended side effects on your random 
generation.


Maybe the GUID generator should have an automatic call to randomize,
but use its own randseed (or preserve the original value):

randseed_old := randseed;
if not guid_rnd_initialized then begin
   randomize;
   guid_rnd_initialized := true;
end
else
   randseed := guid_randseed;
result := rnd2guid(random);
guid_randseed := randseed;
randseed := randseed_old;


It is not that easy to restore the state of random number generator.


Not that easy is quite an understatement here. ;) It's very close to 
impossible without changing the System-unit. That was one issue I had. 
The other one was simple that System's RNG is not thread-safe, so I 
finally decided to use an RNG on a per object basis here.


This makes the necessary locking of a system wide RNG in threading 
context much easier and additionally I can still use a deterministic 
RNG in contexts where I need it, because now I can have as many 
dedicated RNGs as I like. :)


Maybe, such Random class should be incorporated in the FCL, too?


Vinzent.

___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-31 Thread Florian Klaempfl

Vinzent Höfler schrieb:

If Randomize() were truly and more random, one wouldn't need 
Random() after all, would one?


Randomize is rather slow compared with random.
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Mattias Gärtner
Zitat von Graeme Geldenhuys [EMAIL PROTECTED]:

 Hi,

 I'm trying to do performance testing in Firebird RDBMS using GUID's
 and primary keys. I constantly got PK violations. I then wrote the
 code show below to create 50,000 GUID's and add them to a StringList
 (no duplicates allowed). Every time I run this I get a duplicate GUID
 at iteration 1021.  My original test is supposed to create 5mil
 records, but I can't get past 1000! :-(

Sounds like the Debian openssl key fiasko.
Add it to the list:
http://xkcd.com/424/

Mattias


 Actual program output:

 [EMAIL PROTECTED]:index_performance$ ./index_performance.elf
 Duplicate value detected: {FD3DF19D-A878-F8BA-F9D1-108658451E05}
   List.Count = 1021

 GUID's are supposed to be very unique! Wikipedia says something like:
 Create a billion every second for 10 years or something before you
 deplete the range.
 So what is wrong with my code or maybe the Free Pascal implementation?

 [ code ]--
 procedure TMainForm.btnTestClicked(Sender: TObject);
 var
   sl: TStringList;
   s: string;
   i: integer;
   d: integer;
   guid: TGUID;
 begin
   sl := TStringList.Create;
   try
 try
   sl.Sorted := True;
   sl.Duplicates := dupError;
   for i := 1 to 5 do
   begin
 CreateGUID(guid);
 s := GUIDToString(guid);
 sl.Add(s);
   end;
   writeln('Created 50,000 GUIDs');
 except
   on e: EStringListError do
   begin
 writeln('Duplicate value detected: ' + s);
 writeln('  List.Count = ', sl.Count);
   end;
   on e: Exception do
 writeln('Unknown error: ', e.Message);
 end;
   finally
 sl.Free;
   end;
 end;
 [ end ]


 Changing the line that adds the GUID to the StringList by prefixing
 the counter, all is fine. So I can't see a problem in my code.

sl.Add(IntToStr(i) + s);


 Regards,
   - Graeme -


 ___
 fpGUI - a cross-platform Free Pascal GUI toolkit
 http://opensoft.homeip.net/fpgui/
 ___
 fpc-devel maillist  -  fpc-devel@lists.freepascal.org
 http://lists.freepascal.org/mailman/listinfo/fpc-devel



--
Powered by NetMail
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Michael Van Canneyt


On Thu, 29 May 2008, Graeme Geldenhuys wrote:

 Hi,
 
 I'm trying to do performance testing in Firebird RDBMS using GUID's
 and primary keys. I constantly got PK violations. I then wrote the
 code show below to create 50,000 GUID's and add them to a StringList
 (no duplicates allowed). Every time I run this I get a duplicate GUID
 at iteration 1021.  My original test is supposed to create 5mil
 records, but I can't get past 1000! :-(

As a short workaround:

The default implementation on Linux uses a random() call to generate a
guid, combined with a timestamp, if I recall correctly. 
You can use the kernel mechanism by inluding libuuid in your uses clause. 
That should ensure uniqueness.

Michael.
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Marco van de Voort
 On Thu, 29 May 2008, Graeme Geldenhuys wrote:
  I'm trying to do performance testing in Firebird RDBMS using GUID's
  and primary keys. I constantly got PK violations. I then wrote the
  code show below to create 50,000 GUID's and add them to a StringList
  (no duplicates allowed). Every time I run this I get a duplicate GUID
  at iteration 1021.  My original test is supposed to create 5mil
  records, but I can't get past 1000! :-(
 
 As a short workaround:
 
 The default implementation on Linux uses a random() call to generate a
 guid, combined with a timestamp, if I recall correctly. 

rtl/linux/suuid.inc reads from '/proc/sys/kernel/random/uuid' Maybe it is
not used though.

 You can use the kernel mechanism by inluding libuuid in your uses clause. 
 That should ensure uniqueness.

It's unportable though. It is wiser to try to find out why the default (and
portable call) doesn't work on Linux, using a system generator.
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Jonas Maebe


On 29 May 2008, at 13:26, Michael Van Canneyt wrote:


The default implementation on Linux uses a random() call to generate a
guid, combined with a timestamp, if I recall correctly.


Note that random() will always return the same sequence if you don't  
call randomize() once in the program.



Jonas 
___

fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Graeme Geldenhuys
2008/5/29 Mattias Gärtner [EMAIL PROTECTED]:

 Sounds like the Debian openssl key fiasko.

I saw Ubuntu had some updates to resolve this issue on my system. Got
the updates, rebooted, recompiled my application and still 1021 is my
limit before I get duplicates.

What is really weird is that once I hit the 1021 limit, I can't run
that method again. I get a duplicate after 1 add!  It seems to behave
exactly like random() without calling randomize().  It seems to
remember the last position it it's seed or something and tries to
continue where it left off. The same pattern, over and over.


Regards,
 - Graeme -


___
fpGUI - a cross-platform Free Pascal GUI toolkit
http://opensoft.homeip.net/fpgui/
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Graeme Geldenhuys
2008/5/29 Michael Van Canneyt [EMAIL PROTECTED]:
 The default implementation on Linux uses a random() call to generate a
 guid, combined with a timestamp, if I recall correctly.
 You can use the kernel mechanism by inluding libuuid in your uses clause.
 That should ensure uniqueness.

Yup, that works fine, but like Marco said... The underlying problem
still persists.
Thanks for the workaround though.


Regards,
 - Graeme -


___
fpGUI - a cross-platform Free Pascal GUI toolkit
http://opensoft.homeip.net/fpgui/
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Mattias Gärtner
Zitat von Graeme Geldenhuys [EMAIL PROTECTED]:

 2008/5/29 Mattias Gärtner [EMAIL PROTECTED]:
 
  Sounds like the Debian openssl key fiasko.

 I saw Ubuntu had some updates to resolve this issue on my system. Got
 the updates, rebooted, recompiled my application and still 1021 is my
 limit before I get duplicates.

Sorry. Openssl has *nothing* to do with the CreateGUID function.
But the CreateGUID calls the kernel function and if this does not work it calls
Randomize and calls 16 times random(256).
But Randomize only work from time to time, so don't call it often - Bug in
GetRandomBytes.
IMO GetRandomBytes needs to check if Randomize has been called. Or even better:
Randomize should not reset the sequence if no random number is available.


 What is really weird is that once I hit the 1021 limit, I can't run
 that method again. I get a duplicate after 1 add!  It seems to behave
 exactly like random() without calling randomize().  It seems to
 remember the last position it it's seed or something and tries to
 continue where it left off. The same pattern, over and over.

Maybe the 1021 is the limit of /dev/random.

Mattias

___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Graeme Geldenhuys
2008/5/29 Marco van de Voort [EMAIL PROTECTED]:

 rtl/linux/suuid.inc reads from '/proc/sys/kernel/random/uuid' Maybe it is
 not used though.

How do I know if it's using Random or '/proc/sys/kernel/random/uuid'?
Browsing the RTL source code with Lazarus, I believe I am using the
latter, but not 100% sure.


Regards,
 - Graeme -


___
fpGUI - a cross-platform Free Pascal GUI toolkit
http://opensoft.homeip.net/fpgui/
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Florian Klaempfl

Graeme Geldenhuys schrieb:

2008/5/29 Marco van de Voort [EMAIL PROTECTED]:

rtl/linux/suuid.inc reads from '/proc/sys/kernel/random/uuid' Maybe it is
not used though.


How do I know if it's using Random or '/proc/sys/kernel/random/uuid'?
Browsing the RTL source code with Lazarus, I believe I am using the
latter, but not 100% sure.


If it uses /proc/sys/kernel/random/uuid, strace shows it.
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Graeme Geldenhuys
2008/5/29 Mattias Gärtner [EMAIL PROTECTED]:

 Sorry. Openssl has *nothing* to do with the CreateGUID function.

I thought that much, but then thought it wouldn't hurt installing the
patch anyway.

 What is really weird is that once I hit the 1021 limit, I can't run
 that method again. I get a duplicate after 1 add!  It seems to behave
 exactly like random() without calling randomize().  It seems to
 remember the last position it it's seed or something and tries to
 continue where it left off. The same pattern, over and over.

 Maybe the 1021 is the limit of /dev/random.

I gather that you can reproduce the issue and also get stuck on 1021?


Regards,
 - Graeme -


___
fpGUI - a cross-platform Free Pascal GUI toolkit
http://opensoft.homeip.net/fpgui/
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Graeme Geldenhuys
2008/5/29 Florian Klaempfl [EMAIL PROTECTED]:
 How do I know if it's using Random or '/proc/sys/kernel/random/uuid'?
 Browsing the RTL source code with Lazarus, I believe I am using the
 latter, but not 100% sure.

 If it uses /proc/sys/kernel/random/uuid, strace shows it.

Thanks Florian.  I am using the '.../random/uuid'.

nanosleep({0, 7}, {3082747920, 3219878756}) = 0
open(/proc/sys/kernel/random/uuid, O_RDONLY|O_LARGEFILE) = 872
read(872, 2c4bd506-c58f-4b6d-b88c-eec01a05..., 36) = 36
ioctl(3, FIONREAD, [0]) = 0
nanosleep({0, 7}, {3082747920, 3219878756}) = 0
open(/proc/sys/kernel/random/uuid, O_RDONLY|O_LARGEFILE) = 873
read(873, ea14fbdc-8d6b-45de-ae7a-5e6e1908..., 36) = 36
ioctl(3, FIONREAD, [0]) = 0
nanosleep({0, 7},  unfinished ...
Process 6582 detached


I'm not putting a 700ms sleep between each CreateGUID call, to see
what happens. I noticed that once I hit the 1021 limit at normal speed
(no sleep). Every time I click the button quickly (2-3 times per
second) it instantly generates the same GUID. If I wait a second
between clicks, I get a duplicate on the 2nd add to stringlist. Weird,
but then, I got no idea what this will prove!  :-)


Regards,
 - Graeme -


___
fpGUI - a cross-platform Free Pascal GUI toolkit
http://opensoft.homeip.net/fpgui/
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Vincent Snijders

Graeme Geldenhuys schreef:

2008/5/29 Florian Klaempfl [EMAIL PROTECTED]:

How do I know if it's using Random or '/proc/sys/kernel/random/uuid'?
Browsing the RTL source code with Lazarus, I believe I am using the
latter, but not 100% sure.

If it uses /proc/sys/kernel/random/uuid, strace shows it.


Thanks Florian.  I am using the '.../random/uuid'.



See also:
http://forum.soft32.com/linux/PATCH-Time-based-RFC-4122-UUID-generator-ftopict467475.html

random/uuid doesn't seem to support reading lot's of UUID is a short period.

Vincent
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Mattias Gärtner
Zitat von Graeme Geldenhuys [EMAIL PROTECTED]:

 2008/5/29 Mattias Gärtner [EMAIL PROTECTED]:
 
  Sorry. Openssl has *nothing* to do with the CreateGUID function.

 I thought that much, but then thought it wouldn't hurt installing the
 patch anyway.

It would hurt a lot *not* installing the patch. The bigger problem is that the
other distributions including windows, Mac OS X, BSD, ... server must now
install the blacklist too. I guess non debian systems now have bigger problems
than debian.


  What is really weird is that once I hit the 1021 limit, I can't run
  that method again. I get a duplicate after 1 add!  It seems to behave
  exactly like random() without calling randomize().  It seems to
  remember the last position it it's seed or something and tries to
  continue where it left off. The same pattern, over and over.
 
  Maybe the 1021 is the limit of /dev/random.

 I gather that you can reproduce the issue and also get stuck on 1021?

Yes. 1019

And then pango gave:
(testproject:27449): Pango-WARNING **: error opening config file
'/etc/pango/pangorc': Too many open files
Apparently CreateGUID is buggy and should not be used under Linux.


Mattias

___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Marco van de Voort
 GUID's are supposed to be very unique! Wikipedia says something like:
 Create a billion every second for 10 years or something before you
 deplete the range.
 So what is wrong with my code or maybe the Free Pascal implementation?

I quicktested the FreeBSD implementation, verified it used the syscall, and
the first half million are no problem under either 6.3 or (the very recent)
7.0
 

___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Michael Van Canneyt


On Thu, 29 May 2008, Mattias Gärtner wrote:

 Zitat von Graeme Geldenhuys [EMAIL PROTECTED]:
 
  2008/5/29 Mattias Gärtner [EMAIL PROTECTED]:
  
   Sorry. Openssl has *nothing* to do with the CreateGUID function.
 
  I thought that much, but then thought it wouldn't hurt installing the
  patch anyway.
 
 It would hurt a lot *not* installing the patch. The bigger problem is that the
 other distributions including windows, Mac OS X, BSD, ... server must now
 install the blacklist too. I guess non debian systems now have bigger problems
 than debian.
 
 
   What is really weird is that once I hit the 1021 limit, I can't run
   that method again. I get a duplicate after 1 add!  It seems to behave
   exactly like random() without calling randomize().  It seems to
   remember the last position it it's seed or something and tries to
   continue where it left off. The same pattern, over and over.
  
   Maybe the 1021 is the limit of /dev/random.
 
  I gather that you can reproduce the issue and also get stuck on 1021?
 
 Yes. 1019
 
 And then pango gave:
 (testproject:27449): Pango-WARNING **: error opening config file
 '/etc/pango/pangorc': Too many open files
 Apparently CreateGUID is buggy and should not be used under Linux.

Fixed the file handle leak. Merging to fixes now.

Michael.___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Graeme Geldenhuys
2008/5/29 Mattias Gärtner [EMAIL PROTECTED]:

 It would hurt a lot *not* installing the patch. The bigger problem is that the
 other distributions including windows, Mac OS X, BSD, ... server must now
 install the blacklist too. I guess non debian systems now have bigger problems
 than debian.

Yeah, I google'd the debian fiasco to get a better understanding.
It's a *huge* screw-up!

 I gather that you can reproduce the issue and also get stuck on 1021?

 Yes. 1019

 And then pango gave:
 (testproject:27449): Pango-WARNING **: error opening config file
 '/etc/pango/pangorc': Too many open files
 Apparently CreateGUID is buggy and should not be used under Linux.

I need to convert existing data to our new system, so I am in need of
a lot of GUID's quickly. At least in the interim I have a workaround
via the 'libuuid' unit, otherwise I would be in big trouble.

How can I force my fpc to use the 'random' option, instead of
'.../random/uuid'?  Or must I copy and paste the code from RTL into my
own function?

Regards,
 - Graeme -


___
fpGUI - a cross-platform Free Pascal GUI toolkit
http://opensoft.homeip.net/fpgui/
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Michael Van Canneyt


On Thu, 29 May 2008, Graeme Geldenhuys wrote:

 2008/5/29 Mattias Gärtner [EMAIL PROTECTED]:
 
  Sorry. Openssl has *nothing* to do with the CreateGUID function.
 
 I thought that much, but then thought it wouldn't hurt installing the
 patch anyway.
 
  What is really weird is that once I hit the 1021 limit, I can't run
  that method again. I get a duplicate after 1 add!  It seems to behave
  exactly like random() without calling randomize().  It seems to
  remember the last position it it's seed or something and tries to
  continue where it left off. The same pattern, over and over.
 
  Maybe the 1021 is the limit of /dev/random.
 
 I gather that you can reproduce the issue and also get stuck on 1021?

Graeme, 

can you send me your test program, so I can test my fixes ?

Michael.___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Graeme Geldenhuys
2008/5/29 Michael Van Canneyt [EMAIL PROTECTED]:

 can you send me your test program, so I can test my fixes ?


Here you go. It is pretty much what I sent before, except now I made
it a console application instead of a fpGUI one. Below it tries to
create 50,000 GUID's. My SQL version tries 5mil.


-[ project1.pas ]--
program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils;


procedure GUIDTest;
var
  sl: TStringList;
  s: string;
  i: integer;
  d: integer;
  guid: TGUID;
begin
  sl := TStringList.Create;
  try
try
  sl.Sorted := True;
  sl.Duplicates := dupError;
  for i := 1 to 5 do
  begin
CreateGUID(guid);
s := GUIDToString(guid);
sl.Add(s);
//sl.Add(IntToStr(i) + s);
  end;
  writeln('Created ', sl.Count, ' GUIDs');
except
  on e: EStringListError do
  begin
writeln('Duplicate value detected: ' + s);
writeln('  List.Count = ', sl.Count);
  end;
  on e: Exception do
writeln('Unknown error: ', e.Message);
end;
  finally
sl.Free;
  end;
end;

begin
  GUIDTest;
end.

--[ end ]---



Regards,
 - Graeme -


___
fpGUI - a cross-platform Free Pascal GUI toolkit
http://opensoft.homeip.net/fpgui/
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Michael Van Canneyt


On Thu, 29 May 2008, Graeme Geldenhuys wrote:

 2008/5/29 Michael Van Canneyt [EMAIL PROTECTED]:
 
  can you send me your test program, so I can test my fixes ?
 
 
 Here you go. It is pretty much what I sent before, except now I made
 it a console application instead of a fpGUI one. Below it tries to
 create 50,000 GUID's. My SQL version tries 5mil.

Well, after my patch, it creates 500.000 as well, no errors. 
I had to modify your algoritm a bit to make it more efficient,
and I'm too lazy to wait for 5 million. 

So I guess the bug is fixed. It's merged to the fixbranch.

If you want to use your own GUID creation routine, you can
always set the OnCreateGUID handler in sysutils.

Michael.
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Vincent Snijders

Michael Van Canneyt schreef:


On Thu, 29 May 2008, Graeme Geldenhuys wrote:


2008/5/29 Michael Van Canneyt [EMAIL PROTECTED]:

can you send me your test program, so I can test my fixes ?


Here you go. It is pretty much what I sent before, except now I made
it a console application instead of a fpGUI one. Below it tries to
create 50,000 GUID's. My SQL version tries 5mil.


Well, after my patch, it creates 500.000 as well, no errors. 
I had to modify your algoritm a bit to make it more efficient,
and I'm too lazy to wait for 5 million. 


So I guess the bug is fixed. It's merged to the fixbranch.



The bug was probably there, because GetRandomBytes (which was called if the kernel 
function didn't work) return duplicates if it is called within the same tick count. 
Can you fix that too, as suggested by Mattias?


Vincent
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Michael Van Canneyt


On Thu, 29 May 2008, Vincent Snijders wrote:

 Michael Van Canneyt schreef:
  
  On Thu, 29 May 2008, Graeme Geldenhuys wrote:
  
   2008/5/29 Michael Van Canneyt [EMAIL PROTECTED]:
can you send me your test program, so I can test my fixes ?
  
   Here you go. It is pretty much what I sent before, except now I made
   it a console application instead of a fpGUI one. Below it tries to
   create 50,000 GUID's. My SQL version tries 5mil.
  
  Well, after my patch, it creates 500.000 as well, no errors. I had to modify
  your algoritm a bit to make it more efficient,
  and I'm too lazy to wait for 5 million. 
  So I guess the bug is fixed. It's merged to the fixbranch.
  
 
 The bug was probably there, because GetRandomBytes (which was called if the
 kernel function didn't work) return duplicates if it is called within the same
 tick count. Can you fix that too, as suggested by Mattias?

I patched it so Randomize is called only once.
Merged to fixes.

Michael.
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Mattias Gärtner
Zitat von Graeme Geldenhuys [EMAIL PROTECTED]:

 2008/5/29 Mattias Gärtner [EMAIL PROTECTED]:
 
  It would hurt a lot *not* installing the patch. The bigger problem is that
 the
  other distributions including windows, Mac OS X, BSD, ... server must now
  install the blacklist too. I guess non debian systems now have bigger
 problems
  than debian.

 Yeah, I google'd the debian fiasco to get a better understanding.
 It's a *huge* screw-up!

  I gather that you can reproduce the issue and also get stuck on 1021?
 
  Yes. 1019
 
  And then pango gave:
  (testproject:27449): Pango-WARNING **: error opening config file
  '/etc/pango/pangorc': Too many open files
  Apparently CreateGUID is buggy and should not be used under Linux.

 I need to convert existing data to our new system, so I am in need of
 a lot of GUID's quickly. At least in the interim I have a workaround
 via the 'libuuid' unit, otherwise I would be in big trouble.

 How can I force my fpc to use the 'random' option, instead of
 '.../random/uuid'?  Or must I copy and paste the code from RTL into my
 own function?

If the GUID are used in security contexts, then you *must* wait and gather some
real random numbers.
Otherwise you can simply call Randomize once at the start of the program and
use:

Procedure GetRandomBytes(Var Buf; NBytes : Integer);
Var
  I : Integer;
  P : PByte;
begin
  P:[EMAIL PROTECTED];
  For I:=0 to NBytes-1 do
P[i]:=Random(256);
end;

  Randomize; // call this only once every few seconds
  for i:=0 to 500 do begin
GetRandomBytes(GUID,SizeOf(Guid));

This gave me 5 mil unique guids.

Mattias

___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel


Re: [fpc-devel] I get duplicate GUIDs under Linux

2008-05-29 Thread Florian Klaempfl

Vincent Snijders schrieb:

Michael Van Canneyt schreef:


I patched it so Randomize is called only once.
Merged to fixes.


Thanks. BTW, the log message made me think you introduced a new bug :-)
GetRandomBytes calls random only once
instead of
GetRandomBytes calls randomize only once


... and it is not MT safe ;) because the variable is set before the 
actual work is done.

___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel