如何将非数字字符串转换为整数?将非数字字符串转换为整数?
我如:
String unique = "FUBAR";
什么是代表字符串作为一个没有冲突的例如整数的好方法“FUBAR”应该始终表示为相同的数字,不得与任何其他字符串冲突。例如,String a = "A";
应该被表示为Integer 1
等等,但是这样做的方法是什么(最好是所有的unicode字符串,但在我的情况下,ASCII值可能就足够了)。
如何将非数字字符串转换为整数?将非数字字符串转换为整数?
我如:
String unique = "FUBAR";
什么是代表字符串作为一个没有冲突的例如整数的好方法“FUBAR”应该始终表示为相同的数字,不得与任何其他字符串冲突。例如,String a = "A";
应该被表示为Integer 1
等等,但是这样做的方法是什么(最好是所有的unicode字符串,但在我的情况下,ASCII值可能就足够了)。
这是不可能的。想想看,Integer
只能是32位。因此,无论您使用什么技术进行转换,根据鸽舍原理,必须至少存在两个具有相同Integer
值的字符串。在现实中,有相同的值无限...
如果你只是寻找一个有效的映射,那么我建议你只使用返回hashCode()
,其中引用实际上是31位。
好吧,我测试这个:'新Integer(Integer.parseInt(“”+ this.getClass()。getName()。hashCode()+ id))' –
Downvoted,因为它是可能的。十六进制数字包含字符,它们可以很容易地转换为10个基本字符而不会发生任何冲突。 – Torben
@ 909尼克拉什么? 'int idValue =(this.getClass()。getName()+ id).hashCode()' –
如果你知道你的字符串使用的字符集,那么你能想到的字符串作为数比10。例如其他基地,十六进制数字包含从A字母F.
因此,如果您知道您的字符串只包含来自8位字符集的字母,您可以将该字符串视为一个256位的数字。在伪代码,这将是:
number n;
for each letter in string
n = 256 * n + (letter's position in character set)
如果您的字符集包含65535个字符,然后就乘“N”与每一步该号码。但要小心,整数的32位将很容易溢出。您可能需要使用可容纳较大数字的类型。
您可以使用表格将字符串映射到唯一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
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;
}
类似的代码可以用BigInteger完成 –
也许有点晚了,但我想给我的10美分简化它(内部是类似的BigDecimal由@Romain Hippeau建议)
public static BigInteger getNumberId(final String value) {
return new BigInteger(value.getBytes(Charset.availableCharsets().get("UTF-8")));
}
不管通过接受的答案,可以通过计算该字符串的Gödelnumber来将任何字符串表示为整数,这是每个可能的字符串的素数的唯一产物。据说这是非常不切实际和慢的实现,对于大多数字符串,您需要一个BigInteger而不是一个普通的Integer,并且将Gödelnumber解码为相应的字符串,您需要定义一个Charset。
呃。这是字符编码所做的。获取一个字符串的字节,你有一个数字。 – tom
这里的目标是什么?有许多方法可以将字符串转换为数字并保持唯一性。由于任何数据毕竟都是作为一系列比特存储的,所以它不仅仅是一种转换,而是一种重新解释。但是如果你想要任何长度的任何字符串的结果符合一个Java'int'值,那么你正在寻找一个散列函数,其中有很多。然而,永远不可能有完美的保证没有碰撞,因为有更多的可能的字符串比ints(鸽子的原理)。 –
我想不出一种适用于* all * unicode字符串的方式,无论多长时间,并将它们转换为单个'int'。但是,如果你找到一个可靠的方法,回来并命名你的价格:数据压缩公司会爱你;-) – dasblinkenlight