【问题标题】: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”

标签: java string integer type-conversion


【解决方案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 生成完全唯一的ints。

    就非唯一的解决方案而言,您可以使用标准的hashCode 函数,它在Java 中的实现相当不错。对于更复杂的东西,您可以考虑计算加密哈希(SHA-2MD5 等)

    【讨论】:

    • @Nolesh 没有解决方案。
    【解决方案4】:

    将字符串视为某个整数的基数 0x110000 表示(如果您知道字符范围有限,则可以使用较小的基数)。转换为BigInteger

    【讨论】:

      【解决方案5】:

      您不能保证来自不同字符串的唯一整数值​​,因为可能的字符串表示形式比整数多。您可以使用一些众所周知的/定义的散列算法来最大程度地减少冲突的机会。您应该查看 MD5 或 SHA。

      java 类MessageDigest 应该有点用处。

      【讨论】:

      • 不清楚如何获取整数值,因为函数返回一个字节数组
      猜你喜欢
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 2014-07-24
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多