code: @Trivial
      private static MessageDigest getMessageDigest() throws NoSuchAlgorithmException {
          // If we've never been asked for a MessageDigest, create the parent of
          // our clones. This is not thread safe, but it does not really need to
          // be, since we're just establishing the parent. If we incur the cost
          // of creating two clones the first time through, that's really not
          // worth synchronizing this whole method.
          if (CLONEABLE_MESSAGE_DIGEST == null) {
              CLONEABLE_MESSAGE_DIGEST = MessageDigest.getInstance(MESSAGE_DIGEST_ALGORITHM);
          }
  
          // Try to clone the parent. If we can't, then we'll FFDC and create a
          // new instance. If the clone fails, which is REALLY unlikely, as we
          // know the SHA MessageDigest is cloneable on IBM and Sun JDKs, we'll
          // get FFDCs.
          try {
              return (MessageDigest) CLONEABLE_MESSAGE_DIGEST.clone();
          } catch (CloneNotSupportedException cnse) {
              if (tc.isDebugEnabled()) {
                  Tr.debug(tc, "CloneNotSupportedException caught while trying to clone MessageDigest with algorithm " + MESSAGE_DIGEST_ALGORITHM
                               + ". This is pretty unlikely, and we need to get details about the JDK which is in use.", cnse);
              }
              return MessageDigest.getInstance(MESSAGE_DIGEST_ALGORITHM);
          }
      }
docs: Use clone() to get a new instance as its approximately 50% faster (as
  seen in empirical testing), if we can. Worst case scenario is we will
  create a new one each time.
  
  @return
  @throws NoSuchAlgorithmException