안 드 로 이 드 에서 파일 의 md5 값 을 가 져 올 때 첫 번 째 0 이 생략 되 어 31 글자 만 해결 하 는 방법 이 생 겼 습 니 다.

3430 단어 Android기초Java
질문:BigInteger 를 사용 하면 1 위 가 0 일 때 MD5 값 이 31 비트 가 되 는 현상 이 나타 납 니 다.
단일 파일 가 져 오기 MD5 그 중의 한 조작 방식
	/**
	 *        MD5 !

	 * @param file
	 * @return
	 */

	public static String getFileMD5(File file) {

		if (!file.isFile()) {
			return null;
		}
		MessageDigest digest = null;
		FileInputStream in = null;
		byte buffer[] = new byte[1024];
		int len;
		try {
			digest = MessageDigest.getInstance("MD5");
			in = new FileInputStream(file);
			while ((len = in.read(buffer, 0, 1024)) != -1) {
				digest.update(buffer, 0, len);
			}
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		BigInteger bigInt = new BigInteger(1, digest.digest());
		return bigInt.toString(16);
	}

단일 파일 가 져 오기 MD5 다른 조작 방식
public String getMd5(File file){
        String value = null;
        FileInputStream in = null;
        try {
            in = new FileInputStream(file);
            MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(byteBuffer);
            BigInteger bi = new BigInteger(1, md5.digest());
            value = bi.toString(16);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(null != in) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return value;
}

위의 두 가지 방법 은 모두 BigInteger 를 사용 하여 저장 한 후에 문자열 로 바 꾸 면 첫 번 째 가 0 으로 무시 되 는 현상 이 나타난다.
아래 의 방법 은 상술 한 문 제 를 해결 할 수 있다.
	/**
	 *        MD5 !

	 * @param file
	 * @return
	 *     0     
	 */

	public static String getFileMD5(File file) {

		StringBuffer stringbuffer = null;
		try {
			char[] hexDigits = { '0', '1', '2','3', '4','5', '6','7','8', '9', 'a','b' ,'c', 'd','e', 'f' };
			FileInputStream in = new FileInputStream(file);
			FileChannel ch = in.getChannel();
			MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0,file.length());
			MessageDigest messagedigest = MessageDigest.getInstance("MD5");
			messagedigest.update(byteBuffer);
			byte[] bytes = messagedigest.digest();
			int n = bytes.length;
			stringbuffer = new StringBuffer(2 * n);
			for (int l = 0; l < n; l++) {
				byte bt = bytes[l];
				char c0 = hexDigits[(bt & 0xf0) >> 4];
				char c1 = hexDigits[bt & 0xf];
				stringbuffer.append(c0);
				stringbuffer.append(c1);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return stringbuffer.toString();

	}

그러나 위의 이런 방식 은 파일 이 2G 를 초과 하면 초과 할 수 있다. FileChannel 의 map 방법 에서 size 매개 변수 크기 제한,소스 코드 에서 이 매개 변수 값 이 Integer.MAX 보다 큰 것 을 발견 하 였 습 니 다.VALUE 시 IllegalArgument Exception("Size exceeds Integer.MAXVALUE')가 이상 하기 때문에 매우 큰 파일 에 대해 서 는 여전히 적합 하지 않다.
최종 작성 방법 은 이 글 을 참조 합 니 다.
Android 에서 파일 을 가 져 온 md5 는 첫 번 째 0 생략 문 제 를 해결 하고 초대형 파일 문 제 를 해결 합 니 다.
https://blog.csdn.net/dodod2012/article/details/107638940

좋은 웹페이지 즐겨찾기