2016-02-16 60 views
0

我已經爲1個字符串和2個長整型值(對於很多這樣的字符串和長整數組合)生成了SipHash。我用 -Siphash tostring和getBytes()

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

現在我使用轉換這個哈希字符串 -

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

但是,我想要的字符串的字節數組,難道還有什麼辦法,使我能得到這個字符串的字節數組與我從byte[] hashBytes = hash.hash().asBytes();得到的數組相同,我想將我從這些哈希得到的字符串轉換爲字節數組。

其實我意識到bytes數組只用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.fromString(string)將字符串解析回HashCode實例。然後,您可以撥打HashCode實例上的.asBytes()以獲取底層byte[]的副本。

所以基本上你想要的:

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

+0

這沒有工作,我早些時候曾嘗試過。 –