Issue Details (XML | Word | Printable)

Key: AXIS-2597
Type: Bug Bug
Status: Open Open
Priority: Major Major
Assignee: Unassigned
Reporter: Elwin Ho
Votes: 0
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
Axis

CLONE -SimpleUUIDGen.nextUUID() is very, very, very slow

Created: 08/Dec/06 11:57 PM   Updated: 24/Apr/07 11:17 AM
Return to search
Component/s: None
Affects Version/s: 1.1
Fix Version/s: None

Time Tracking:
Not Specified

File Attachments:
  Size
File Licensed for inclusion in ASF works SimpleUUIDGen.diff 2007-04-24 11:17 AM Rodrigo Ruiz 10 kB
Environment: Any
Issue Links:
Cloners
 


 Description  « Hide
It takes .4917 seconds to generate just one UUID. (Yes, seconds.) This renders the feature very nearly useless.

In SimpleUUIDGen, there is a simple, but very expensive, bug.. It creates a new instance of SecureRandom on each call to nextUUID(). Making a new instance of SecureRandom is very expensive because it has to set up the environment for producing cryptographically strong random numbers.

The instance of SecureRandom should be in a static variable and init'ed just once. Then, you call getNextLong() when you want another number from it. It would be much faster that way without compromising the integrity of the UUIDs generated.

BTW, If you look at the comment I copied from the code, it appears that this is what the developer meant to make the SecureRandom instance static, but forgot.

    /**
     * Creates a new UUID. The algorithm used is described by The Open Group.
     * See <a href="http://www.opengroup.org/onlinepubs/009629399/apdxa.htm">
     * Universal Unique Identifier</a> for more details.
     * <p>
     * Due to a lack of functionality in Java, a part of the UUID is a secure
     * random. This results in a long processing time when this method is called
     * for the first time.
     */


Here's a proposed fix. In the member variables, add the following.

    private static Random secureRandom = null;
    static {
        try {
            secureRandom = SecureRandom.getInstance("SHA1PRNG", "SUN");
        } catch (Exception e) {
            secureRandom = new Random();
        }
    }


The, remove the code near line 235 where the SecureRandom is being created.

This change should do it just once.




 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
There are no subversion log entries for this issue yet.