안 드 로 이 드 에서 파일 의 md5 값 을 가 져 올 때 첫 번 째 0 이 생략 되 어 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.