从给定的数字字符串生成一个 16 位唯一的十六进制值
Generate a 16 digit unique Hexadecimal value from given string of numbers
我该怎么做?我尝试使用 SHA-1 和 MD5,但输出对于我的要求来说太长,截断不会使其唯一。
输入:包含数字的字符串,例如(0302160123456789)
收到输出:30f2bddc3e2fba9c05d97d04f8da4449
所需输出:范围内的唯一编号 (0000000000000000 - FFFFFFFFFFFFFFFF) 和 16 个字符长
非常感谢任何帮助/指点。
您会收到超过 FFFFFFFFFFFFFFFF 个不同的字符串吗?
如果不是那么这是生成整数的简单问题:第一个字符串将得到 0 接下来的 1 等等;你只需保留一个字符串列表并检查是否出现相同的内容。
您可以像这样使用 BigInteger
将您的数字转换为十六进制:
String id = new BigInteger("0302160123456789").toString(16);
System.out.println(id);
这给出:
112d022d2ed15
你的输入域有多大?如果它大于您的输出域,则 Pigeon Hole principle 适用并且您无法根据定义获得唯一输出。
如果输入域小于或等于输出域,那么您可以使用块密码提供的 Pseudo-Random Permutation (PRP) 轻松完成此操作。
16进制的输出相当于8个字节,相当于64位。 DES(和三重 DES)是具有此块大小的块密码。
以紧凑的方式将输入字符串解析为字节数组。如果输入总是由数字组成,您可以使用 Ebbe M. Pedersen 的方法
byte[] plaintext = new BigInteger("0302160123456789").toByteArray();
然后您可以为 Triple DES 生成一些随机但固定的 24 字节密钥并实例化密码:
Cipher c = Cipher.getInstance("DESede/ECB/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "DESede"));
byte[] ciphertext = c.doFinal(plaintext);
使用某种十六进制转换器来获得您想要的表示形式。
您可以 "hash" 使用此号码最多 36028797018963968。如果你想要更大的数字(最多 9223372036854775808),那么你需要使用 "DESede/ECB/NoPadding"
并用一些填充字节填充自己。
我该怎么做?我尝试使用 SHA-1 和 MD5,但输出对于我的要求来说太长,截断不会使其唯一。
输入:包含数字的字符串,例如(0302160123456789)
收到输出:30f2bddc3e2fba9c05d97d04f8da4449
所需输出:范围内的唯一编号 (0000000000000000 - FFFFFFFFFFFFFFFF) 和 16 个字符长
非常感谢任何帮助/指点。
您会收到超过 FFFFFFFFFFFFFFFF 个不同的字符串吗?
如果不是那么这是生成整数的简单问题:第一个字符串将得到 0 接下来的 1 等等;你只需保留一个字符串列表并检查是否出现相同的内容。
您可以像这样使用 BigInteger
将您的数字转换为十六进制:
String id = new BigInteger("0302160123456789").toString(16);
System.out.println(id);
这给出:
112d022d2ed15
你的输入域有多大?如果它大于您的输出域,则 Pigeon Hole principle 适用并且您无法根据定义获得唯一输出。
如果输入域小于或等于输出域,那么您可以使用块密码提供的 Pseudo-Random Permutation (PRP) 轻松完成此操作。
16进制的输出相当于8个字节,相当于64位。 DES(和三重 DES)是具有此块大小的块密码。
以紧凑的方式将输入字符串解析为字节数组。如果输入总是由数字组成,您可以使用 Ebbe M. Pedersen 的方法
byte[] plaintext = new BigInteger("0302160123456789").toByteArray();
然后您可以为 Triple DES 生成一些随机但固定的 24 字节密钥并实例化密码:
Cipher c = Cipher.getInstance("DESede/ECB/PKCS5Padding"); c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "DESede")); byte[] ciphertext = c.doFinal(plaintext);
使用某种十六进制转换器来获得您想要的表示形式。
您可以 "hash" 使用此号码最多 36028797018963968。如果你想要更大的数字(最多 9223372036854775808),那么你需要使用 "DESede/ECB/NoPadding"
并用一些填充字节填充自己。