10cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard/** 20cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * Copyright (C) 2012 The Android Open Source Project 30cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * 40cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * Licensed under the Apache License, Version 2.0 (the "License"); you may not 50cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * use this file except in compliance with the License. You may obtain a copy of 60cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * the License at 70cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * 80cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * http://www.apache.org/licenses/LICENSE-2.0 90cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * 100cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * Unless required by applicable law or agreed to in writing, software 110cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 120cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 130cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * License for the specific language governing permissions and limitations under 140cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard * the License. 150cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard */ 160cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard 170cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalardpackage com.android.inputmethod.dictionarypack; 180cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard 190cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalardimport java.io.InputStream; 200cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalardimport java.io.IOException; 210cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalardimport java.security.MessageDigest; 220cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard 239087d19fc03ac16d8e64ff35c07d4e88343141cfJean Chalardpublic final class MD5Calculator { 240cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard private MD5Calculator() {} // This helper class is not instantiable 250cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard 260cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard public static String checksum(final InputStream in) throws IOException { 270cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard // This code from the Android documentation for MessageDigest. Nearly verbatim. 280cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard MessageDigest digester; 290cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard try { 300cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard digester = MessageDigest.getInstance("MD5"); 310cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard } catch (java.security.NoSuchAlgorithmException e) { 320cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard return null; // Platform does not support MD5 : can't check, so return null 330cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard } 340cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard final byte[] bytes = new byte[8192]; 350cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard int byteCount; 360cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard while ((byteCount = in.read(bytes)) > 0) { 370cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard digester.update(bytes, 0, byteCount); 380cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard } 390cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard final byte[] digest = digester.digest(); 400cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard final StringBuilder s = new StringBuilder(); 410cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard for (int i = 0; i < digest.length; ++i) { 420cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard s.append(String.format("%1$02x", digest[i])); 430cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard } 440cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard return s.toString(); 450cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard } 460cc0544a2995c7eb54a830ae54db60af89d4073dJean Chalard} 47