/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.oneandone.idev.johanna.store.id; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Objects; import java.util.Random; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.bind.DatatypeConverter; import org.apache.commons.codec.binary.Hex; /** * * @author kiesel */ public class MD5Identifier extends Identifier { private static Random random; private byte[] id; public MD5Identifier(String prefix, IdentifierFactory identifierFactory) { super(prefix, identifierFactory); try { initRandom(); this.createUniqid(); } catch (NoSuchAlgorithmException ex) { Logger.getLogger(MD5Identifier.class.getName()).log(Level.SEVERE, null, ex); } } MD5Identifier(IdentifierFactory identifierFactory) { this("", identifierFactory); } public static Identifier forId(String id, IdentifierFactory identifierFactory) { Objects.requireNonNull(id); Objects.requireNonNull(identifierFactory); MD5Identifier self= new MD5Identifier(prefixPartOf(id, identifierFactory), identifierFactory); self.id= DatatypeConverter.parseHexBinary(uniquePartOf(id, identifierFactory)); return self; } private void createUniqid() throws NoSuchAlgorithmException { byte[] b32 = new byte[32]; random.nextBytes(b32); MessageDigest digest= MessageDigest.getInstance("md5"); this.id= digest.digest(b32); } @Override protected String uniqid() { return Hex.encodeHexString(id); } private void initRandom() throws NoSuchAlgorithmException { if (null != random) return; // Length operation random= new Random(0x80); } }