1、Android 写法
/** * MD5加密算法 * * @param val 需要加密的字符串 * @return * @throws NoSuchAlgorithmException */public static String getMD5(String val) { try { MessageDigest bmd5 = MessageDigest.getInstance("MD5"); bmd5.update(val.getBytes()); int i; StringBuffer buf = new StringBuffer(); byte[] b = bmd5.digest(); for (int offset = 0; offset < b.length; offset++) { i = b[offset]; if (i < 0) i += 256; if (i < 16) buf.append("0"); buf.append(Integer.toHexString(i)); } return buf.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; }
2、Java写法
/** * md5或者sha-1加密 * * @param inputText * 要加密的内容 * @param algorithmName * 加密算法名称:md5或者sha-1,不区分大小写 * @return */ private static String encrypt(String inputText, String algorithmName) { try { MessageDigest m = MessageDigest.getInstance(algorithmName); m.update(inputText.getBytes("UTF8")); byte s[] = m.digest(); // m.digest(inputText.getBytes("UTF8")); return hex(s); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return ""; } // 返回十六进制字符串 private static String hex(byte[] arr) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < arr.length; ++i) { sb.append(Integer.toHexString((arr[i] & 0xFF) | 0x100).substring(1, 3)); } return sb.toString(); }
3、IOS写法
+ (NSString *)md5:(NSString *)str{ const char *cStr = [str UTF8String]; unsigned char result[32]; CC_MD5( cStr, strlen(cStr), result ); return [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", result[0],result[1],result[2],result[3], result[4],result[5],result[6],result[7], result[8],result[9],result[10],result[11], result[12],result[13],result[14],result[15], result[16], result[17],result[18], result[19], result[20], result[21],result[22], result[23], result[24], result[25],result[26], result[27], result[28], result[29],result[30], result[31]];}
4、Android JNI 方法
#include "md5.h"#include <jni.h>#include <stdlib.h>#include <string>void ByteToHexStr(const char *source, char *dest, int sourceLen) { short i; char highByte, lowByte; for (i = 0; i < sourceLen; i++) { highByte = source[i] >> 4; lowByte = source[i] & 0x0f; highByte += 0x30; if (highByte > 0x39) { dest[i * 2] = highByte + 0x07; } else { dest[i * 2] = highByte; } lowByte += 0x30; if (lowByte > 0x39) { dest[i * 2 + 1] = lowByte + 0x07; } else { dest[i * 2 + 1] = lowByte; } }}//转成小写字符void MyToLower(char *s){ int len=strlen(s); for(int i=0;i<len;i++){ if(s[i]>='A'&&s[i]<='Z'){ //s[i]=tolower(s[i]); s[i]+=32;//+32转换为小写,-32为大写 //s[i]=s[i]-'A'+'a'; } }}// byte数组转MD5字符串extern "C"jstring ToMd5(JNIEnv *env, jbyteArray source) { // MessageDigest类 jclass classMessageDigest = env->FindClass("java/security/MessageDigest"); // MessageDigest.getInstance()静态方法 jmethodID midGetInstance = env->GetStaticMethodID(classMessageDigest, "getInstance", "(Ljava/lang/String;)Ljava/security/MessageDigest;"); // MessageDigest object jobject objMessageDigest = env->CallStaticObjectMethod(classMessageDigest, midGetInstance, env->NewStringUTF("md5")); // update方法,这个函数的返回值是void,写V jmethodID midUpdate = env->GetMethodID(classMessageDigest, "update", "([B)V"); env->CallVoidMethod(objMessageDigest, midUpdate, source); // digest方法 jmethodID midDigest = env->GetMethodID(classMessageDigest, "digest", "()[B"); jbyteArray objArraySign = (jbyteArray) env->CallObjectMethod(objMessageDigest, midDigest); jsize intArrayLength = env->GetArrayLength(objArraySign); jbyte *byte_array_elements = env->GetByteArrayElements(objArraySign, NULL); size_t length = (size_t) intArrayLength * 2 + 1; char *char_result = (char *) malloc(length); memset(char_result, 0, length); // 将byte数组转换成16进制字符串,发现这里不用强转,jbyte和unsigned char应该字节数是一样的 ByteToHexStr((const char *) byte_array_elements, char_result, intArrayLength); // 在末尾补\0 *(char_result + intArrayLength * 2) = '\0'; //如果需要转小写,请添加这个方法 //MyToLower(char_result); jstring stringResult = env->NewStringUTF(char_result); // release env->ReleaseByteArrayElements(objArraySign, byte_array_elements, JNI_ABORT); // 释放指针使用free free(char_result); env->DeleteLocalRef(classMessageDigest); env->DeleteLocalRef(objMessageDigest); return stringResult;}