使用用户电子邮件(默认情况下它是唯一标识符),如果我需要当前时间戳,我希望生成一个由11个字符(或更少的字符)组成的字母数字字符串,该字符串代表唯一的标识符。
首先,为了创建一个特殊的(不可逆转的)算法来完成它,我想知道在Java中是否有什么东西。
发布于 2014-05-05 21:55:13
正如其他人指出的,不可能从每个电子邮件地址生成长度为11的唯一字母数字字符串,因为长度为11的字母数字字符串小于所有可能的电子邮件地址。因此,总是有两个不同的电子邮件地址e1和e2,因此对于您生成的字符串S,F(e1) = F(e2) = S。
但是,给定一个电子邮件地址e1,您可以生成一个字符串,它是(我们称之为)“伪唯一的”,即字符串S = F(e1),实际上是非常难找到另一个电子邮件地址e2 != e1,以便F(e2) =SE 217。正如其他人所指出的,您可以使用例如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);
    }
}https://stackoverflow.com/questions/23482145
复制相似问题