|
19 | 19 | * Created by koush on 4/12/14. |
20 | 20 | */ |
21 | 21 | public class FileCache { |
22 | | - |
23 | | - private MessageDigest messageDigest; |
24 | | - |
25 | 22 | class CacheEntry { |
26 | 23 | final long size; |
27 | 24 | public CacheEntry(File file) { |
@@ -65,16 +62,23 @@ private static MessageDigest findAlternativeMessageDigest() { |
65 | 62 | return null; |
66 | 63 | } |
67 | 64 |
|
68 | | - public String toKeyString(Object... parts) { |
69 | | - synchronized (FileCache.class) { // I spreaded synchronized block to whole method to assure |
70 | | - // that only one thread deals with our copy of MessageDigest |
71 | | - // instance |
72 | | - for (Object part : parts) { |
73 | | - messageDigest.update(part.toString().getBytes()); |
| 65 | + public static String toKeyString(Object... parts) { |
| 66 | + MessageDigest messageDigest; |
| 67 | + synchronized (FileCache.class) { |
| 68 | + try { |
| 69 | + messageDigest = MessageDigest.getInstance(hashAlgorithm); |
| 70 | + } catch (NoSuchAlgorithmException e) { |
| 71 | + messageDigest = findAlternativeMessageDigest(); |
| 72 | + if (null == messageDigest) |
| 73 | + throw new RuntimeException(e); |
74 | 74 | } |
75 | | - byte[] md5bytes = messageDigest.digest(); |
76 | | - return new BigInteger(1, md5bytes).toString(16); |
77 | 75 | } |
| 76 | + |
| 77 | + for (Object part : parts) { |
| 78 | + messageDigest.update(part.toString().getBytes()); |
| 79 | + } |
| 80 | + byte[] md5bytes = messageDigest.digest(); |
| 81 | + return new BigInteger(1, md5bytes).toString(16); |
78 | 82 | } |
79 | 83 |
|
80 | 84 | boolean loadAsync; |
@@ -271,33 +275,10 @@ public FileCache(File directory, long size, boolean loadAsync) { |
271 | 275 | this.loadAsync = loadAsync; |
272 | 276 | cache = new InternalCache(); |
273 | 277 |
|
274 | | - try { |
275 | | - messageDigest = (MessageDigest) MessageDigest.getInstance(hashAlgorithm); |
276 | | - cloneMessageDigest(messageDigest); |
277 | | - } catch (NoSuchAlgorithmException e1) { |
278 | | - messageDigest = findAlternativeMessageDigest(); |
279 | | - if (null == messageDigest) |
280 | | - throw new RuntimeException(e1); |
281 | | - cloneMessageDigest(messageDigest); |
282 | | - } |
283 | | - |
284 | 278 | directory.mkdirs(); |
285 | 279 | doLoad(); |
286 | 280 | } |
287 | 281 |
|
288 | | - // taken from https://github.com/candrews/HttpResponseCache/commit/a93c92d1d8b87778ac7bb2fa2fe2759e7ca06219 |
289 | | - private void cloneMessageDigest(MessageDigest messageDigest){ |
290 | | - try { |
291 | | - // clone the messageDigest instance as a workaround for |
292 | | - // java.security.MessageDigest.getInstance(String) not being thread safe in Android |
293 | | - // see https://code.google.com/p/android/issues/detail?id=37937 |
294 | | - messageDigest = (MessageDigest) messageDigest.clone(); |
295 | | - } catch (CloneNotSupportedException e) { |
296 | | - // ignore the exception and use the original messageDigest. |
297 | | - // hopefully whatever platform we're on doesn't have the bug that requires the cloning workaround |
298 | | - } |
299 | | - } |
300 | | - |
301 | 282 | public long size() { |
302 | 283 | return cache.size(); |
303 | 284 | } |
|
0 commit comments