使用用户电子邮件(默认情况下它是唯一标识符),如果我需要当前时间戳,我想生成一个11个字符(或更少)的字母数字字符串,表示唯一标识符。
首先要创建一个ad hoc(不可逆)算法,我想知道在Java中是否有东西。
答案 0 :(得分:0)
正如其他人所指出的那样,无法从每个电子邮件地址生成长度为的唯一字母数字字符串,因为长度为11 的字母数字字符串小于所有可能的电子邮件地址。因此,对于您生成的某些字符串 S ,总会有两个不同的电子邮件地址e1和e2, F(e1)= F(e2)= S 。
但是,如果给出一个电子邮件地址 e1 ,您可以生成一个字符串(让我们称之为)“伪唯一”,即字符串 S = F(e1) 实际上很难找到另一个电子邮件地址 e2!= e1 ,以便 F(e2)= S 。正如其他人指出的那样,你可以使用例如MD5实现这一目标。
查看此类并在从您的电子邮件地址获取的字节数组上调用它。
http://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html
实际上这是一个使用MD5的例子。
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Test003 {
public static void main(String[] args) throws Exception {
System.out.println(getPseudoUniqueString("test1@test.com"));
System.out.println(getPseudoUniqueString("test2@test.com"));
}
private static String getPseudoUniqueString(String str)
throws NoSuchAlgorithmException
{
MessageDigest md1 = MessageDigest.getInstance("MD5");
md1.update(str.getBytes());
byte[] bd1 = md1.digest();
StringBuffer hexString = new StringBuffer();
for (int i=0;i<bd1.length;i++) {
String hex=Integer.toHexString(0xff & bd1[i]);
if(hex.length()==1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString().substring(0,11);
}
}