0

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

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

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

所以,要么:

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

4 回答 4

3

您可以将字节编码为十六进制以获得可打印的文件名。但是您的算法不能保证唯一性。

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

于 2012-07-13T11:04:35.010 回答
2

尝试:

String filename=UUID.randomUUID().toString()
于 2012-07-13T11:05:13.067 回答
1

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

于 2012-07-13T11:04:47.533 回答
0

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

于 2012-07-13T11:06:15.303 回答