2016-02-16 3 views
0

Я создал SipHash для 1 строки и 2 длинных значений (для многих таких комбинаций строки и длинной). Я -Siphash tostring и getBytes()

Hasher hash = Hashing.sipHash24().newHasher().putUnencodedChars("abcd").putLong(123).putLong(123); 

Теперь я преобразовал этот хэш строки с помощью -

String hashString = hash.hash().toString(); 

Но я хотел байт массив строки, Может ли быть иначе, так что я могу получить массив байтов из этой строки, такой же, как тот, который я получил бы от byte[] hashBytes = hash.hash().asBytes();. Я хотел преобразовать строку, полученную из этих хэшей в массив байтов.

Фактически я понял, что массив байтов использует только 8 байтов пространства для siphash, где, поскольку длина строки составляет 18 байт. Итак, я предполагаю, что сохранение хэша в виде байтового массива будет более оптимизировано.

ответ

1
BaseEncoding.base16().lowerCase().decode(string) 

должен преобразовать HashCode.toString() обратно в массив байтов вы получили от asBytes().

0

Вот код, чтобы получить байт массив из строки -

public static byte[] getBytes(String hashString) { 

    final byte[] bytes = new byte[8]; 

    HashMap<Character, String> bin = new HashMap<>(); 
    bin.put('0', "0000"); 
    bin.put('1', "0001"); 
    bin.put('2', "0010"); 
    bin.put('3', "0011"); 
    bin.put('4', "0100"); 
    bin.put('5', "0101"); 
    bin.put('6', "0110"); 
    bin.put('7', "0111"); 
    bin.put('8', "1000"); 
    bin.put('9', "1001"); 
    bin.put('a', "1010"); 
    bin.put('b', "1011"); 
    bin.put('c', "1100"); 
    bin.put('d', "1101"); 
    bin.put('e', "1110"); 
    bin.put('f', "1111"); 

    for (int i = 0; i < 16 && i < hashString.length(); i += 2) { 

     final BitSet bitset = new BitSet(8); 
     String byteBinary = bin.get(hashString.charAt(i)) + bin.get(hashString.charAt(i + 1)); 
     for (int j = 0; j<8; j++) { 

      if (byteBinary.charAt(j) == '1') 
       bitset.set(7-j, true); 
      else 
       bitset.set(7-j, false); 
     } 


     bytes[i/2] = bitset.toByteArray()[0]; 
     //System.out.println(byteBinary); 
    } 
    return bytes; 
} 
1

Вы можете проанализировать строку обратно в экземпляр HashCode с помощью HashCode.fromString(string). Затем вы можете позвонить .asBytes() на экземпляр HashCode, чтобы вернуть копию базового byte[].

Так в основном вы хотите:

byte[] bytes = HashCode.fromString(string).asBytes();

+0

Это не сработало, я попробовал его раньше. –

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