2014-08-28 6 views
1

Я нахожусь на Android, так что это просто java, у меня одинаковые строки ввода, но каждый раз получаю разные значения. Мне ничего не хватает? БлагодаряMD5 возвращает разные значения для одного и того же входа

private String getShortenedKey(String key) { 
     String shortenedKey=null; 
     MessageDigest md = null; 
     LogUtils.LOGD(HASH_ALGO, "before key: "+ System.currentTimeMillis()); 
     try { 
      md = MessageDigest.getInstance("MD5"); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
      shortenedKey = key; 
     } 
     LogUtils.LOGD(HASH_ALGO, "after key: "+ System.currentTimeMillis()); 

     md.update(key.getBytes()); 
     byte[] shortenedBytes = md.digest(); 
     shortenedKey = String.valueOf(shortenedBytes); 
     return shortenedKey; 
    } 

Входная строка:

{"config":{"wp":"(1.000000,1.000000,1.000000,1.000000)","v":"8","unit":"auto","ef":true,"ws":1,"tt":0,"cs":1},"items":[{"startTime":1409180400,"id":"[email protected]_1409180400","class":"event","endTime":1409209200,"location":{"lng":151.20785,"lat":-33.85926},"priority":0},{"startTime":1409148000,"id":"[email protected]_1409148000","class":"event","endTime":1409234340,"location":{"lng":151.18089,"lat":-33.89153},"priority":0}]} 

Update: так много действительных ответов, спасибо. Я выбираю тот, который легче всего изменить. Приветствия.

ответ

0

проверить измененную версию. можно использовать кодирование base64 для байт

private String getShortenedKey(String key) { 
    String shortenedKey=null; 
    MessageDigest md = null; 
    LogUtils.LOGD(HASH_ALGO, "before key: "+ System.currentTimeMillis()); 
    try { 
     md = MessageDigest.getInstance("MD5"); 

     md.update(key.getBytes()); 
     byte[] shortenedBytes = md.digest(); 
     shortenedKey = Base64.encodeToString(shortenedBytes, Base64.NO_WRAP); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
     shortenedKey = key; 
    } 
    LogUtils.LOGD(HASH_ALGO, "after key: "+ System.currentTimeMillis()); 

    return shortenedKey; 
} 
1

Эта линия

shortenedKey = String.valueOf(shortenedBytes); 

не делать то, что вы думаете.

Чтобы получить строковое представление значений байтов внутри массива, вам нужно реализовать небольшой полезный метод.

Кроме того, если вызов MessageDigest.getInstance("MD5"); когда-либо бросает NoSuchAlgorithmException программа зависнет чуть позже здесь md.update(key.getBytes()); с NullPointerException.

+0

Спасибо, я уже отслеживаются 'NoSuchAlgorithmException' и использовать оригинальный ключ, если это произойдет. –

1

Как @Henry объяснил этот вопрос на свой ответ, String.valueOf(shortenedBytes) должен быть изменен.

Заменить это;

shortenedKey = String.valueOf(shortenedBytes); 

к этому;

shortenedKey = new String(Base64.encode(shortenedBytes)) 

Вы можете использовать Base64 из Bouncycastle

Download the jar

Смежные вопросы