2015-04-05 2 views
0

У меня есть переменная String, которую я хочу преобразовать в переменную long.Длинное значение строки, которая не содержит чисел

Проблема состоит в том, что переменная String никогда не будет содержать никаких чисел, поэтому простое вызов Long.parseLong(myString); будет вызывать .

Чтобы уточнить мои намерения:

У меня есть метод, который возвращает long из String в-параметра. Я хочу, чтобы метод генерировал идентификатор на основе переменной String, чтобы впоследствии иметь возможность группировать значения long.

Я могу решить это, используя выражение RegEx, но мой вопрос в том, есть ли какой-либо прямой способ получить значение longString?

+2

Вам нужен алгоритм хеширования. –

+0

проверьте это http://stackoverflow.com/questions/2624192/good-hash-function-for-strings – Mzf

+0

Я вижу. Вы бы не сидели на одном из них, не так ли? Ничего не нужно :-) @JamesMcLaughlin – Marcus

ответ

2

Вы говорите, что вы хотите a 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() 
+0

Я этого не узнал, спасибо. Не могли бы вы привести пример в свой ответ, пожалуйста? – Marcus

+0

Незначительное примечание: '037L' на самом деле является восьмеричным литералом со значением' 31L' десятичным. – RealSkeptic

+0

@RealSkeptic Спасибо за исправление. Для ясности я остался в начале нуля. Исправленный. – rossum

-1

если вы хотите простой и легкий способ, вы можете использовать хэш-код() в Java, и вот пример

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()); 
    } 
} 

или вы можете реализовать свой собственный хэш-функция

+0

Только проблема заключается в том, что 'String.hashCode()' возвращает ** int **, а не ** long **. Конечно, 'int' присваивается' long'.Но вы получаете только половину значений, которые вам нужно, и у вас больше коллизий (одинаковый результат для разных строк). – RealSkeptic

+0

хеш-код не решает проблему ID из-за столкновений –

+0

@RealSkeptic Вы даже не получаете половину возможных значений. 2^32 = sqrt (2^64), а не (2^42/2). – hexafraction

Смежные вопросы