不包含数字的String的长值

时间:2015-04-05 19:34:43

标签: java

我有一个String变量,我想将其转换为long变量。

问题是String变量永远不会包含任何数字,因此只需调用Long.parseLong(myString);就会抛出NumberFormatException

澄清我的意图:

我有一个从long in-parameter返回String的方法。我希望该方法基于String变量生成ID,以便稍后能够对long值进行分组。

我可以使用RegEx表达式来解决这个问题,但我的问题是,是否有任何直接的方法来获得long的{​​{1}}值?

2 个答案:

答案 0 :(得分:2)

您说您想要long值。内置的hashCode()会返回int,而不是long。如果确实需要long,则需要使用返回long的散列方法。有许多可能性,但我通常建议FNV哈希用于非加密目的。它非常容易编码,并且有各种尺寸,包括64位。

ETA:FNV哈希的代码位于我链接到的FNV网站上。需要注意的是1)无符号v。带符号的64位数字和2)字符编码。

long FNV64Hash(String inString) throws UnsupportedEncodingException {
    // FNV-64 constants.
    long FNVprime = 1099511628211L;

    // Needs workround for unsigned 64-bit: 14695981039346656037.
    long FNVbasis = (146959810393466560L * 100L) + 37L;
    // Alternative: long FNVbasis = -3750763034362895579L;

    // Convert string to bytes.
    byte[] bytes = inString.getBytes("UTF-8"); // Specify a character encoding.

    long hash = FNVbasis;
    for (byte aByte : bytes) {
        hash ^= aByte;
        hash *= FNVbasis;
    }
    return hash;
} // end FNV64Hash()

答案 1 :(得分:-1)

如果你想要一种简单易用的方法,你可以在java中使用hashCode(),这是一个例子

import java.io.*;

public class StringHashing{
   public static void main(String args[]){
      String Str = new String("HELLO WORLD !!");
      System.out.println("Hashcode for Str :" + Str.hashCode() );
   }
}

或者您可以实现自己的哈希函数