【问题标题】:BaseX XML database codeBaseX XML 数据库代码
【发布时间】:2010-06-03 13:36:43
【问题描述】:

我是计算机科学专业的学生,​​我们必须在其中一门课程中使用 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 哈希......是吗?

【问题讨论】:

    标签: java xml database md5 basex


    【解决方案1】:

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

    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 是 'a' 的 ASCII/Unicode 代码点。

    【讨论】:

      【解决方案2】:

      我猜 Matti 是对的 - 因为 md.digest() 返回一个 byte[] 并且 BaseX 使用 Tokens 而不是 Strings(因此是 TokenBuilder)。 所以从 md.digest() 到 String 的转换是通过 Digest-Hex 到 Token 的转换来完成的。

      不太容易阅读,但与 Apache Commons 在其Codec Library 中所做的非常相似 获取 md5 哈希的字符串值。

      【讨论】:

        【解决方案3】:

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

        嗯,这是一个核心方法,不应该被其他人修改——这看起来是最有效的方法。但是,确实,文档可能会更好。说起核心方法,看一下像 Integer.getChars() 这样的代码还是值得的:

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

        【讨论】:

        • 无论你的代码多么“核心”,它最终都会被某人阅读(就像刚刚),因此它应该是可读的。以更易读的格式编写表达式或至少为可怜的读者留下评论不会牺牲效率。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-07
        相关资源
        最近更新 更多