Java中的文件名兼容哈希值

时间:2012-07-13 11:00:51

标签: java hash filenames

为了在用户提供的文件的文件系统名称中生成一些唯一性,我生成一些其他用户提供的数据的哈希值(在这种情况下是用户的IP地址和随机整数),并在其前面添加文件名。我选择了SHA-1算法来执行此哈希。不幸的是,字符串从

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

...当然包含各种奇怪的奇异字符,其中大部分都不允许存在于文件名中。

所以,要么:

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

尝试:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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