如何将非数字字符串转换为整数?
我得到了例如:
String unique = "FUBAR";
将String表示为整数而没有冲突的好方法是什么? “FUBAR”应始终表示为相同的数字,并且不得与任何其他字符串冲突。例如,String a = "A";
应该表示为整数1
,依此类推,但是这样做的方法是什么(最好是对所有unicode字符串,但在我的情况下,ASCII值就足够了)。
答案 0 :(得分:7)
这是不可能的。想一想,Integer
只能是32位。因此,根据鸽子原则,无论您使用何种技术进行转换,都必须存在至少两个具有相同Integer
值的字符串。实际上,存在着无限的相同价值......
如果您只是在寻找有效的映射,那么我建议您只使用int
返回的hashCode()
,其参考值实际为31位。
答案 1 :(得分:3)
您可以使用表格将字符串映射到唯一ID。通常无法做到这一点。
final Map<String, Integer> map = new HashMap<>();
public int idFor(String s) {
Integer id = map.get(s);
if (id == null)
map.put(s, id = map.size());
return id;
}
注意:拥有唯一ID并不能保证哈希集合中没有冲突。
http://vanillajava.blogspot.co.uk/2013/10/unique-hashcodes-is-not-enough-to-avoid.html
答案 2 :(得分:2)
如果您知道字符串中使用的字符集,那么您可以将字符串视为基数不是10的数字。例如,十六进制数字包含从A到F的字母。
因此,如果您知道您的字符串只包含来自8位字符集的字母,则可以将该字符串视为256个基数。在伪代码中,这将是:
number n;
for each letter in string
n = 256 * n + (letter's position in character set)
如果你的字符集包含65535个字符,那么只需在每一步中将'n'与该数字相乘。但要注意,整数的32位很容易溢出。您可能需要使用可以容纳更多数字的类型。
答案 3 :(得分:1)
private BigDecimal createBigDecimalFromString(String data)
{
BigDecimal value = BigDecimal.ZERO;
try
{
byte[] tmp = data.getBytes("UTF-8");
int numBytes = tmp.length;
for(int i = numBytes - 1; i >= 0; i--)
{
BigDecimal exponent = new BigDecimal(256).pow(i);
value = value.add(exponent.multiply(new BigDecimal(tmp[i])));
}
}
catch (UnsupportedEncodingException e)
{
}
return value;
}
答案 4 :(得分:1)
无论接受的答案是什么,都可以通过计算String的Gödelnumber将任何String表示为整数,Gödelnumber是每个可能字符串的素数的唯一乘积。有人说它实现起来非常不切实际且执行起来很慢,对于大多数字符串来说,你需要一个BigInteger而不是一个普通的Integer,并将Gödelnumber解码为相应的String,你需要有一个定义的Charset。
答案 5 :(得分:0)
也许有点迟了,但我要给我10美分来简化它(内部类似于@Romain Hippeau建议的BigDecimal)
public static BigInteger getNumberId(final String value) {
return new BigInteger(value.getBytes(Charset.availableCharsets().get("UTF-8")));
}