【问题标题】:File name compatible hash values in JavaJava中文件名兼容的哈希值
【发布时间】:2012-07-13 11:00:50
【问题描述】:

为了在用户提供的文件的文件系统名称中生成一些唯一性,我生成了一些其他用户提供的数据(在本例中是用户的 IP 地址和一个随机整数)的哈希值,并在文件名前加上它。我选择了 SHA-1 算法来执行这个哈希。不幸的是,从

返回的字符串
md = MessageDigest.getInstance("SHA-1");
// Add values to the digest
String ipAddrHash = new String(md.digest());

...当然包含各种奇怪的外来字符,其中大部分是不允许出现在文件名中的。

所以,要么:

  • 如何将哈希值字符串转换为包含可在文件名中使用的“常规字符”的字符串?
  • 在 Java 中是否有一个简单的单向函数可供我使用,它可以生成一个不可逆的值供我立即在文件名中使用?

【问题讨论】:

    标签: java hash filenames


    【解决方案1】:

    您可以encode the bytes in hexadecimal 获取可打印的文件名。但是您的算法不能保证唯一性。

    或者您可以简单地使用UUID,或从数据库序列返回的序列号。

    【讨论】:

    • 这对我来说似乎是最简单的解决方案。将代码更改为 String ipAddrHash = new String(Hex.encodeHex(md.digest()));使用 Apache Commons 库会产生一个文件名兼容的名称。
    • @DCKing:为什么是new String()?字符串是不可变的。直接使用 encodeHex 方法的结果。但要小心潜在的碰撞。
    • 没错,新的字符串是不必要的。唯一性对我来说不是必需的(时间戳也附加到文件中),我什至在以后切断了哈希字符串。
    【解决方案2】:

    试试:

    String filename=UUID.randomUUID().toString()
    

    【讨论】:

      【解决方案3】:

      如果只是唯一性,请使用java.util.UUID。 FWIW,我有类似的要求,这就是我用来解决它的方法(在 linux 和 windows 上运行的软件)。 UUID 仅包含字母数字和连字符,因此不会出现文件系统字符不兼容的问题并保证唯一性。

      【讨论】:

        【解决方案4】:

        您可以使用 Base32 或 Base64 对返回的字符串进行编码,并将“/”字符替换为安全字符(例如:“_”)。

        【讨论】:

          猜你喜欢
          • 2012-04-22
          • 2016-04-28
          • 1970-01-01
          • 1970-01-01
          • 2015-01-19
          • 2014-03-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-28
          相关资源
          最近更新 更多