BaseX XML код базы данных - PullRequest
1 голос
/ 03 июня 2010

Я студент информатики, и мы должны использовать BaseX (чистая база данных Java OSS 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 ... не так ли?

Ответы [ 3 ]

5 голосов
/ 03 июня 2010

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

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 голосов
/ 04 июня 2010

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

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

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

0 голосов
/ 04 июня 2010

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

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

...