从字符串中获取唯一的整数值
Posted
技术标签:
【中文标题】从字符串中获取唯一的整数值【英文标题】:Get unique integer value from string 【发布时间】:2013-07-09 03:29:49 【问题描述】:我有相同格式的不同唯一字符串。字符串看起来像这样axf25!j&809>-11~dc
,我想从这个字符串中获取唯一的整数值。 每次这个值都必须相同,并且取决于字符串。我尝试将字符串的每个 char 转换为 int,然后将 char 相加。但如果我有 2 个具有相同符号集的字符串,它会返回彼此相等的整数值。所以不适合我。如何从唯一字符串生成唯一整数值?
更新:
考虑了所有给定的解决方案后,我决定创建生成唯一整数值的函数。我希望它排除碰撞。
public int getUniqueInteger(String name)
String plaintext = name;
int hash = name.hashCode();
MessageDigest m;
try
m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
String hashtext = bigInt.toString(10);
// Now we need to zero pad it if you actually want the full 32 chars.
while(hashtext.length() < 32 )
hashtext = "0"+hashtext;
int temp = 0;
for(int i =0; i<hashtext.length();i++)
char c = hashtext.charAt(i);
temp+=(int)c;
return hash+temp;
catch (NoSuchAlgorithmException e)
// TODO Auto-generated catch block
e.printStackTrace();
return hash;
【问题讨论】:
为什么不使用getBytes
将每个字符转换成对应的ASCII?然后把这些加起来。
使用String#hashCode()
?
hashCode 不保证唯一性!
@DevlshOne 这不区分“aabc”和“cbaa”
【参考方案1】:
你可以用代码试试:
import java.math.BigInteger;
public static BigInteger stringToBigInteger(String text)
BigInteger bigInt = new BigInteger(text.getBytes());
return bigInt;
谢谢。
【讨论】:
与 String 相比,它的内存消耗是多少?【参考方案2】:您可以只使用String.hashCode()
(例如mystring.hashCode()
)为您提供一定程度的独特性,但您必须确保您可以处理冲突。
【讨论】:
【参考方案3】:您不能从足够长的字符串because there are more 10-character strings than 32-bit integers 生成完全唯一的int
s。
就非唯一的解决方案而言,您可以使用标准的hashCode
函数,它在Java 中的实现相当不错。对于更复杂的东西,您可以考虑计算加密哈希(SHA-2、MD5 等)
【讨论】:
@Nolesh 没有解决方案。【参考方案4】:将字符串视为某个整数的基数 0x110000
表示(如果您知道字符范围有限,则可以使用较小的基数)。转换为BigInteger
。
【讨论】:
【参考方案5】:您不能保证来自不同字符串的唯一整数值,因为可能的字符串表示形式比整数多。您可以使用一些众所周知的/定义的散列算法来最大程度地减少冲突的机会。您应该查看 MD5 或 SHA。
java 类MessageDigest 应该有点用处。
【讨论】:
不清楚如何获取整数值,因为函数返回一个字节数组以上是关于从字符串中获取唯一的整数值的主要内容,如果未能解决你的问题,请参考以下文章