-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Description
Description
Consider a pre-.NET 6 library used from .NET 6 that has a derived Random class but doesn't override the NextInt64 methods (example).
As such a class has no overridden NextInt64 methods, the internal Net5CompatImpl implementation kicks in, whose private NextUInt64 method ends up calling the Next() method 8 times for each byte in the ulong sample to be generated.
Proposed fix
Please consider changing the current NextUInt64 method like this:
private unsafe ulong NextUInt64()
{
Span<byte> resultBytes = stackalloc byte[8];
_parent.NextBytes(resultBytes); // instead of: NextBytes(resultBytes);
return BitConverter.ToUInt64(resultBytes);
}The proposed change above calls the possibly overridden NextBytes(Span<byte>) overload, which gives a chance for a pre-.NET 6 class to fill up the buffer much more efficiently. If NextBytes(Span<byte>) is not overridden either, then this eventually calls the current Net5CompatImpl implementation with those repeated Next calls.
Risks
This will produce different results from the current implementation but since .NET 6 is not released yet I don't think it's a real issue.