diff --git a/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/random/RandomUtils.java b/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/random/RandomUtils.java
index 1387a4c..35b8585 100644
--- a/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/random/RandomUtils.java
+++ b/commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/random/RandomUtils.java
@@ -63,120 +63,6 @@
         }
 
         /**
-         * Generates a random string of hex characters of length {@code len}.
-         *
-         * <strong>Algorithm Description:</strong> how hexadecimal strings are
-         * generated depends on the value of the {@code useSha1} argument.
-         *
-         * <ul>
-         *  <li>If {@code useSha1 == false}, a 2-step process is used:
-         *   <ol>
-         *    <li>
-         *     {@code len / 2 + 1} binary bytes are generated using the underlying
-         *     generator.
-         *    </li>
-         *    <li>
-         *     Each binary byte is translated into 2 hex digits.
-         *    </li>
-         *   </ol>
-         *  </li>
-         *  <li>
-         *   If {@code useSha1 == true}, hex strings are generated in 40-byte
-         *   segments using a 3-step process:
-         *   <ol>
-         *    <li>
-         *     20 random bytes are generated using the underlying generator.
-         *    </li>
-         *    <li>
-         *     SHA-1 hash is applied to yield a 20-byte binary digest.
-         *    </li>
-         *    <li>
-         *     Each byte of the binary digest is converted to 2 hex digits.
-         *    </li>
-         *   </ol>
-         *  </li>
-         * </ul>
-         *
-         * @param len Length of the generated string.
-         * @param useSha1 Whether to use a digest.
-         * If {@code true} (resp. {@code false}), the 3-step (resp. 2-step)
-         * process will be used.
-         * @return the random string.
-         * @throws NotStrictlyPositiveException if {@code len <= 0}.
-         */
-        public String nextHexString(int len,
-                                    boolean useSha1) {
-            if (len <= 0) {
-                throw new NotStrictlyPositiveException(LocalizedFormats.LENGTH, len);
-            }
-
-            // Initialize output buffer.
-            final StringBuilder outBuffer = new StringBuilder();
-
-            if (!useSha1) {
-                // Generate int(len/2)+1 random bytes.
-                final byte[] randomBytes = new byte[(len / 2) + 1];
-                rng.nextBytes(randomBytes);
-
-                // Convert each byte to 2 hex digits.
-                for (int i = 0; i < randomBytes.length; i++) {
-                    final Integer c = Integer.valueOf(randomBytes[i]);
-
-                    // Add 128 to byte value to make interval 0-255 before
-                    // conversion to hex.
-                    // This guarantees <= 2 hex digits from "toHexString".
-                    // "toHexString" would otherwise add 2^32 to negative arguments.
-                    String hex = Integer.toHexString(c.intValue() + 128);
-
-                    // Make sure we add 2 hex digits for each byte.
-                    if (hex.length() == 1) {
-                        hex = "0" + hex;
-                    }
-                    outBuffer.append(hex);
-                }
-            } else {
-                MessageDigest alg = null;
-                try {
-                    alg = MessageDigest.getInstance("SHA-1");
-                } catch (NoSuchAlgorithmException ex) {
-                    // Should never happen.
-                    throw new MathInternalError(ex);
-                }
-                alg.reset();
-
-                // Compute number of iterations required (40 bytes each).
-                final int numIter = (len / 40) + 1;
-
-                for (int iter = 1; iter < numIter + 1; iter++) {
-                    final byte[] randomBytes = new byte[40];
-                    rng.nextBytes(randomBytes);
-                    alg.update(randomBytes);
-
-                    // Create 20-byte binary hash.
-                    final byte[] hash = alg.digest();
-
-                    // Loop over the hash, converting each byte to 2 hex digits
-                    for (int i = 0; i < hash.length; i++) {
-                        final Integer c = Integer.valueOf(hash[i]);
-
-                        // Add 128 to byte value to make interval 0-255.
-                        // This guarantees <= 2 hex digits from "toHexString".
-                        // "toHexString" would otherwise add 2^32 to negative arguments.
-                        String hex = Integer.toHexString(c.intValue() + 128);
-
-                        // Keep strings uniform length: guarantees 40 bytes.
-                        if (hex.length() == 1) {
-                            hex = "0" + hex;
-                        }
-                        outBuffer.append(hex);
-                    }
-                }
-            }
-
-            return outBuffer.toString().substring(0, len);
-        }
-
-        /**
          * Generates a uniformly distributed random long integer between {@code lower}
          * and {@code upper} (endpoints included).
          *
diff --git a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/random/RandomUtilsDataGeneratorAbstractTest.java b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/random/RandomUtilsDataGeneratorAbstractTest.java
index ec25174..1edb371 100644
--- a/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/random/RandomUtilsDataGeneratorAbstractTest.java
+++ b/commons-math-legacy/src/test/java/org/apache/commons/math4/legacy/random/RandomUtilsDataGeneratorAbstractTest.java
@@ -136,65 +136,6 @@
                        (((double) upper) - ((double) lower));
         Assert.assertTrue(ratio > 0.99999);
     }
- 
-   /** Test dispersion and failure modes for "nextHex". */
-    @Test
-    public void testNextHexWithoutSha1() {
-        checkNextHex(false);
-    }
-    @Test
-    public void testNextHexWithSha1() {
-        checkNextHex(true);
-    }
-
-    /**
-     * @param useSha1 Alternative.
-     */
-    private void checkNextHex(boolean useSha1) {
-        try {
-            randomData.nextHexString(-1, useSha1);
-            Assert.fail("negative length supplied -- MathIllegalArgumentException expected");
-        } catch (MathIllegalArgumentException ex) {
-            // ignored
-        }
-        try {
-            randomData.nextHexString(0, useSha1);
-            Assert.fail("zero length supplied -- MathIllegalArgumentException expected");
-        } catch (MathIllegalArgumentException ex) {
-            // ignored
-        }
-        String hexString = randomData.nextHexString(3, useSha1);
-        if (hexString.length() != 3) {
-            Assert.fail("incorrect length for generated string");
-        }
-        hexString = randomData.nextHexString(1, useSha1);
-        if (hexString.length() != 1) {
-            Assert.fail("incorrect length for generated string");
-        }
-        try {
-            hexString = randomData.nextHexString(0, useSha1);
-            Assert.fail("zero length requested -- expecting MathIllegalArgumentException");
-        } catch (MathIllegalArgumentException ex) {
-            // ignored
-        }
-        Frequency<String> f = new Frequency<>();
-        for (int i = 0; i < smallSampleSize; i++) {
-            hexString = randomData.nextHexString(100, useSha1);
-            if (hexString.length() != 100) {
-                Assert.fail("incorrect length for generated string");
-            }
-            for (int j = 0; j < hexString.length(); j++) {
-                f.addValue(hexString.substring(j, j + 1));
-            }
-        }
-        double[] expected = new double[16];
-        long[] observed = new long[16];
-        for (int i = 0; i < 16; i++) {
-            expected[i] = (double) smallSampleSize * 100 / 16;
-            observed[i] = f.getCount(hex[i]);
-        }
-        TestUtils.assertChiSquareAccept(expected, observed, 0.001);
-    }
 
     @Test
     public void testNextUniformIAE() {
