package org.commcare.models; import org.javarosa.core.util.externalizable.Hasher; import org.javarosa.core.util.externalizable.PrototypeFactory; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.HashMap; /** * @author ctsims */ public class AndroidClassHasher extends Hasher { private static AndroidClassHasher instance; private static final int CLASS_HASH_SIZE = 4; private final MessageDigest mMessageDigester; private final HashMap<String, byte[]> classNameHashMap = new HashMap<>(); private AndroidClassHasher() { try { mMessageDigester = java.security.MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } public synchronized static AndroidClassHasher getInstance() { if (instance == null) { instance = new AndroidClassHasher(); } return instance; } public static void registerAndroidClassHashStrategy() { PrototypeFactory.setStaticHasher(getInstance()); } @Override public synchronized byte[] getHash(Class c) { String name = c.getName(); if (classNameHashMap.containsKey(name)) { return classNameHashMap.get(name); } byte[] hash = mMessageDigester.digest(name.getBytes()); classNameHashMap.put(name, hash); return hash; } public synchronized byte[] getClassnameHash(String className) { return Arrays.copyOf(mMessageDigester.digest(className.getBytes()), CLASS_HASH_SIZE); } @Override public int getHashSize() { return CLASS_HASH_SIZE; } }