//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.core.utils; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.concurrent.atomic.AtomicLong; import uk.gov.dstl.baleen.exceptions.BaleenException; /** * Utility class for identity related functionality, such as hashing strings and getting internal IDs * * * */ public class IdentityUtils { private static final IdentityUtils INSTANCE = new IdentityUtils(); private AtomicLong id = new AtomicLong(1L); private IdentityUtils(){ // Private constructor as all our functions should be static in a Utils class } /** * Get the singleton instance of IdentityUtils */ public static IdentityUtils getInstance(){ return INSTANCE; } /** * Get a new ID that can be used as an internal ID. * The ID will be unique within the current runtime of Baleen */ public long getNewId(){ return id.getAndIncrement(); } /** * Create a SHA-256 hash from one or more strings * * @param strings The strings to concatenate and hash * @return The hashed string * @throws BaleenException If a MessageDigest instance cannot be retrieved for the SHA-256 algorithm */ public static String hashStrings (String... strings) throws BaleenException{ StringBuilder hash = new StringBuilder(); StringBuilder concat = new StringBuilder(); for(String s : strings){ if(s != null) concat.append(s); } try { MessageDigest md = MessageDigest.getInstance("SHA-256"); md.reset(); byte[] buffer = concat.toString().getBytes(StandardCharsets.UTF_8); md.update(buffer); byte[] digest = md.digest(); for(int i = 0; i < digest.length; i++){ hash.append(Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1)); } } catch (NoSuchAlgorithmException e) { throw new BaleenException("Can't get MessageDigest instance for constructing hashes", e); } return hash.toString(); } }