Siphash tostring和getBytes()

时间:2016-02-16 10:02:12

标签: java string byte guava

我为1个字符串和2个长值生成了SipHash(对于很多这样的字符串和long组合)。我用过 -

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

现在我使用 -

将此哈希转换为字符串
String hashString = hash.hash().toString();

但是,我想要字符串的字节数组,可能有任何方法,这样我就可以从这个字符串中获取字节数组,就像我从byte[] hashBytes = hash.hash().asBytes();得到的字符串一样我想要的将我从这些哈希中得到的字符串转换为字节数组。

实际上我意识到字节数组仅为siphash使用了8个字节的空间,其中字符串的长度为18个字节。所以,我想将哈希存储为字节数组会更加优化。

3 个答案:

答案 0 :(得分:2)

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

应该将HashCode.toString()转换回您将从asBytes()获得的字节数组。

答案 1 :(得分:1)

您可以使用HashCode将字符串解析回HashCode.fromString(string)实例。然后,您可以在.asBytes()实例上调用HashCode以获取基础byte[]的副本。

所以基本上你想要:

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

答案 2 :(得分: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;
}