RFR: 8258588: MD5 MessageDigest in java.util.UUID should be cached

Sean Mullan mullan at openjdk.java.net
Fri Dec 18 14:40:24 UTC 2020


On Fri, 18 Dec 2020 14:29:00 GMT, PROgrm_JARvis <github.com+7693005+JarvisCraft at openjdk.org> wrote:

>> There are pre-existing microbenchmarks for java.security under test/micro/org/openjdk/bench/java/security
>> 
>> You can build and run these using `make test TEST=micro:YourBenchmark`. Refer to [doc/testing.md](https://github.com/openjdk/jdk/blob/master/doc/testing.md) for some required configuration steps. 
>> 
>> I'd suggest starting with a simple micro that zooms in on MessageDigest.getInstance("MD5"), maybe like so:
>> 
>> /*
>>  * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
>>  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
>>  *
>>  * This code is free software; you can redistribute it and/or modify it
>>  * under the terms of the GNU General Public License version 2 only, as
>>  * published by the Free Software Foundation.
>>  *
>>  * This code is distributed in the hope that it will be useful, but WITHOUT
>>  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
>>  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
>>  * version 2 for more details (a copy is included in the LICENSE file that
>>  * accompanied this code).
>>  *
>>  * You should have received a copy of the GNU General Public License version
>>  * 2 along with this work; if not, write to the Free Software Foundation,
>>  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
>>  *
>>  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
>>  * or visit www.oracle.com if you need additional information or have any
>>  * questions.
>>  */
>> package org.openjdk.bench.java.security;
>> 
>> import java.security.DigestException;
>> import java.security.MessageDigest;
>> import java.security.NoSuchAlgorithmException;
>> import java.security.NoSuchProviderException;
>> import java.util.Random;
>> import java.util.concurrent.TimeUnit;
>> import org.openjdk.jmh.annotations.Benchmark;
>> import org.openjdk.jmh.annotations.BenchmarkMode;
>> import org.openjdk.jmh.annotations.Fork;
>> import org.openjdk.jmh.annotations.Measurement;
>> import org.openjdk.jmh.annotations.Mode;
>> import org.openjdk.jmh.annotations.OutputTimeUnit;
>> import org.openjdk.jmh.annotations.Param;
>> import org.openjdk.jmh.annotations.Scope;
>> import org.openjdk.jmh.annotations.Setup;
>> import org.openjdk.jmh.annotations.State;
>> import org.openjdk.jmh.annotations.Warmup;
>> 
>> /**
>>  * Tests speed of looking up MessageDigests.
>>  */
>> @State(Scope.Thread)
>> @BenchmarkMode(Mode.AverageTime)
>> @OutputTimeUnit(TimeUnit.NANOSECONDS)
>> @Warmup(iterations = 5, time = 1)
>> @Measurement(iterations = 10, time = 1)
>> @Fork(value = 3)
>> public class GetMessageDigest {
>> 
>>     @Benchmark
>>     public MessageDigest getMD5Digest() throws NoSuchAlgorithmException {
>>         return MessageDigest.getInstance("MD5");
>>     }
>> }
>
>> I'd suggest starting with a simple micro that zooms in on MessageDigest.getInstance("MD5"), maybe like so:
> 
> Thanks, that's what I wanted to hear.
> I will implement it now.

> I've looked through [Standard Algorithms section for MessageDigest](https://docs.oracle.com/en/java/javase/15/docs/specs/security/standard-names.html#messagedigest-algorithms) and is says
> 
> > Algorithm names that _can_ be specified
> 
> And the javadoc of `MessageDigest` says:
> 
> > Every implementation of the Java platform is required to support the following standard `MessageDigest` algorithms:
> > 
> > * `SHA-1`
> > * `SHA-256`
> 
> So I cannot find any requirement for `MD5` to be present. Although I believe that every implementation does provide it, it may be essential to either specify it or describe the behavior for its absence in case of `UUID`'s usage.

MD5 and DES were removed as SE requirements in JDK 14. See https://bugs.openjdk.java.net/browse/JDK-8214483 for more information. However, there are no plans to remove the implementations from the JDK at this time.

-------------

PR: https://git.openjdk.java.net/jdk/pull/1821


More information about the core-libs-dev mailing list