2010-06-03 2 views
1

Я студент информатики, и мы должны использовать BaseX (чистую Java-базу данных OSS XML) на одном из наших курсов. При просмотре кода я обнаружил следующий фрагмент кода:BaseX XML код базы данных

/** 
    * Returns a md5 hash. 
    * @param pw password string 
    * @return hash 
    */ 
    public static String md5(final String pw) { 
    try { 
     final MessageDigest md = MessageDigest.getInstance("MD5"); 
     md.update(Token.token(pw)); 
     final TokenBuilder tb = new TokenBuilder(); 
     for(final byte b : md.digest()) { 
     final int h = b >> 4 & 0x0F; 
     tb.add((byte) (h + (h > 9 ? 0x57 : 0x30))); 
     final int l = b & 0x0F; 
     tb.add((byte) (l + (l > 9 ? 0x57 : 0x30))); 
     } 
     return tb.toString(); 
    } catch(final Exception ex) { 
     Main.notexpected(ex); 
     return pw; 
    } 
    } 

(источник: https://svn.uni-konstanz.de/dbis/basex/trunk/basex/src/main/java/org/basex/util/Token.java)

Просто из интереса: что там происходит? Почему эти байтовые операции после MD5? Докшрин говорит, что возвращает хеш MD5 ... не так ли?

ответ

5

Я не искал определения для используемых классов, но операции байта, по-видимому, кодируют возвращаемый массив байтов в строку шестнадцатеричных символов.

for(final byte b : md.digest()) { 
    // get high 4 bytes of current byte 
    final int h = b >> 4 & 0x0F; 
    // convert into hex digit (0x30 is '0' while 0x57+10 is 'a') 
    tb.add((byte) (h + (h > 9 ? 0x57 : 0x30))); 
    // the same for the bottom 4 bits 
    final int l = b & 0x0F; 
    tb.add((byte) (l + (l > 9 ? 0x57 : 0x30))); 
} 

Это отличный пример того, почему использование магических чисел является плохим. Я, например, честно не мог вспомнить, что 0x57 + 10 является кодовым пунктом ASCII/Unicode для «a», не проверяя его в интерпретаторе Python.

+0

Thx для выяснения –

0

Я думаю, что Матти прав - поскольку md.digest() возвращает байт [], а BaseX использует токены в пользу строк (таким образом, TokenBuilder). Итак, преобразование из md.digest() в String выполняется путем преобразования Digest-Hex в токен.

Не совсем легко читать, но очень похоже на то, что делает Apache Commons в своем Codec Library , чтобы получить значение String для хеша md5.

0

Это отличный пример того, почему использование магических чисел является плохим.

Ну, это основной метод, который не должен быть модифицирован другими - и это выглядит как наиболее эффективный способ сделать это. Но, правда, документация может быть лучше. Говоря о ключевых методов, это стоит смотреть на код, как Integer.getChars():

http://www.docjar.com/html/api/java/lang/Integer.java.html

+0

Независимо от того, как «ядро» ваш код, он в конечном итоге будет прочитан кем-то (* как только сейчас *), и поэтому он должен быть читаемым. Эффективность не была бы принесена в жертву, написав выражения в более читаемом формате или, по крайней мере, оставив комментарий для плохого читателя. –

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