首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >固定长度的唯一字符串标识符

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

Stack Overflow用户
提问于 2014-05-05 21:22:34
回答 1查看 1.9K关注 0票数 0

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

首先,为了创建一个特殊的(不可逆转的)算法来完成它,我想知道在Java中是否有什么东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的例子。

代码语言:javascript
运行
复制
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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23482145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档