code: public UUID fingerprint() {
          try {
              final var bb = ByteBuffer.wrap(MessageDigest.getInstance("MD5").digest(
                  serialized(Set.of(SIGNATURE_KEY, DIGEST_KEY))));
              final var ms = bb.getLong();
              final var ls = bb.getLong();
              return new UUID(ms, ls);
          } catch (final Exception e) {
              return null;
          }
      }
docs: Get the fingerprint of a license. The fingerprint is a 128bit value calculated from the license itself using the
  MD5 algorithm. The fingerprint is represented as a UUID. The fingerprint is never stored in the license as a
  feature. If the fingerprint is stored in the license as a feature then the fingerprint of the license changes
  so the stored fingerprint will not be the fingerprint of the license any more.
  <p>
  The calculation of the fingerprint ignores the signature of the license as well as the feature that stores the
  name of the signature digest algorithm (usually "SHA-512"). This is to ensure that even if you change the
  signature on the license using a different digest algorithm: fingerprint will not change. The fingerprint is
  relevant to the core content of the license.
  <p>
  Since the fingerprint is calculated from the binary representation of the license using the MD5 algorithm
  it is likely that each license will have different fingerprint. This fingerprint can be used to identify
  licenses similarly like the license id (see {@link #setLicenseId(UUID)},{@link #getLicenseId()}). The
  fingerprint can be used even when the license does not have random ID stored in the license.
  
  @return the calculated fingerprint of the license