我是计算机科学的学生,我们必须在我们的课程中使用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之后执行这些字节操作?docstring说它返回一个md5散列……是吗?

最佳答案

我没有查找所用类的定义,但字节操作似乎是将返回的字节数组编码为一个十六进制字符字符串。

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是'a'的ascii/unicode码位,而没有在python解释器中检查它。

关于java - BaseX XML数据库代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2966440/

10-09 19:40