From 1a9a74309110a7c122abdaad0dd0ed0956283134 Mon Sep 17 00:00:00 2001 From: Steve Lhomme Date: Mon, 28 Jul 2014 09:55:36 +0200 Subject: use another hash function if MD5 is not available --- .../src/com/koushikdutta/async/util/FileCache.java | 43 ++++++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/AndroidAsync/src/com/koushikdutta/async/util/FileCache.java b/AndroidAsync/src/com/koushikdutta/async/util/FileCache.java index 3ce4b97..d117108 100644 --- a/AndroidAsync/src/com/koushikdutta/async/util/FileCache.java +++ b/AndroidAsync/src/com/koushikdutta/async/util/FileCache.java @@ -6,6 +6,8 @@ import java.io.IOException; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.security.Provider; +import java.security.Security; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -41,17 +43,42 @@ public class FileCache { } } + private static String hashAlgorithm = "MD5"; + + private static MessageDigest findAlternativeMessageDigest() { + if ("MD5".equals(hashAlgorithm)) { + for (Provider provider : Security.getProviders()) { + for (Provider.Service service : provider.getServices()) { + hashAlgorithm = service.getAlgorithm(); + try { + MessageDigest messageDigest = MessageDigest.getInstance(hashAlgorithm); + if (messageDigest != null) + return messageDigest; + } catch (NoSuchAlgorithmException ignored) { + } + } + } + } + return null; + } + public static String toKeyString(Object... parts) { - try { - MessageDigest messageDigest = MessageDigest.getInstance("MD5"); - for (Object part: parts) { - messageDigest.update(part.toString().getBytes()); + MessageDigest messageDigest; + synchronized (FileCache.class) { + try { + messageDigest = MessageDigest.getInstance(hashAlgorithm); + } catch (NoSuchAlgorithmException e) { + messageDigest = findAlternativeMessageDigest(); + if (null == messageDigest) + throw new RuntimeException(e); } - byte[] md5bytes = messageDigest.digest(); - return new BigInteger(1, md5bytes).toString(16); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); } + + for (Object part : parts) { + messageDigest.update(part.toString().getBytes()); + } + byte[] md5bytes = messageDigest.digest(); + return new BigInteger(1, md5bytes).toString(16); } boolean loadAsync; -- cgit v1.2.3