【问题标题】:Unique string identifier with fixed length固定长度的唯一字符串标识符
【发布时间】:2014-05-05 21:22:34
【问题描述】:

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

首先创建一个 ad hoc(不可逆)算法来做到这一点,我想知道在 Java 中是否有什么。

【问题讨论】:

  • 你试过散列函数吗?
  • 你可以使用 MD5 或 SHA1 并且只保留前 11 个字符
  • 一个 11 个字符(或更少)的字母数字字符串,用于唯一标识电子邮件地址 + 时间戳的所有组合?假设您的字母数字是 A-Za-z0-9,则只有 52,036,560,683,837,093,888 个可能的 11 个字符串,并且还有更多可能的电子邮件地址。
  • 您希望它是对称的还是不对称的? support.microsoft.com/kb/246071
  • @Alexandre Santos 算法必须是不可逆的,无论是对称的还是非对称的,因为它是在服务器端加密的,并且无法解密。

标签: java algorithm cryptography uuid uniqueidentifier


【解决方案1】:

正如其他人指出的那样,不可能从每个电子邮件地址生成长度为 11 的唯一字母数字字符串,因为 长度为 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);
    }
}

【讨论】:

    猜你喜欢
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多