代码之家  ›  专栏  ›  技术社区  ›  Martin Thurau

BaseX XML数据库代码

  •  1
  • Martin Thurau  · 技术社区  · 14 年前

    我是一名计算机专业的学生,在我们的一门课程中必须使用BaseX(一个纯javaossxml数据库)。在浏览代码时,我发现了以下代码:

      /**
        * 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散列…是吗?

    3 回复  |  直到 12 年前
        1
  •  4
  •   Matti Virkkunen    14 年前

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

    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)));
    }
    

    这是一个很好的例子,说明为什么使用幻数是不好的。一、 首先,老实说,如果没有在Python解释器中检查0x57+10,就无法记住0x57+10是“a”的ASCII/Unicode码点。

        2
  •  1
  •   michael    14 年前

    我想Matti是对的,因为md.digest()返回一个byte[],而BaseX使用令牌来代替字符串(因此是TokenBuilder)。 因此,从md.digest()到String的转换是通过digest Hex到Token的转换完成的。

    不太容易阅读,但与apachecommons在其 Codec Library 获取md5哈希的字符串值。

        3
  •  0
  •   Christian Grün    9 年前

    这是一个很好的例子,说明为什么使用幻数是不好的。

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