具有固定长度的唯一字符串标识

时间:2014-05-05 21:22:35

标签: java algorithm cryptography uuid uniqueidentifier

使用用户电子邮件(默认情况下它是唯一标识符),如果我需要当前时间戳,我想生成一个11个字符(或更少)的字母数字字符串,表示唯一标识符。

首先要创建一个ad hoc(不可逆)算法,我想知道在Java中是否有东西。

1 个答案:

答案 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);
    }
}