2014-07-17 26 views
0

随着番石榴,散列可以是简单的有没有简单的方法从番石榴的HashCode中提取多个值?

但似乎只为你想要的是一个byte[](可能转换为十六进制字符串),或单intlong。但在一个地方,我需要两个long s和在另一个我需要从sha1五个int

我可以看到一些解决方案,如从new DataInputStream(new ByteArrayInputStream(byteHash))读取,使用ByteBuffer或手动从byte[]进行转换。然而,他们都非常丑陋(例如吞下不可能的IOException)和长期(也效率低下,但这并不影响我)。

那么是否有任何简单的方法从Guava的HashCode中提取多个(非字节)值?

回答

1

没有什么内置到HashCode为此,没有。

做你需要ByteBuffer什么似乎很容易,虽然,不长也不是特别低效:

ByteBuffer buf = ByteBuffer.wrap(byteHash); 
long l1 = buf.getLong(); 
long l2 = buf.getLong(); 

(我假设一个asReadOnlyByteBuffer()方法可避免用于克隆的字节数组的需要,但我不知道知道这是否真的有必要。)

+0

我无法准确记得'ByteBuffer'如何被用于这样的事情,我发现的东西太糟糕了,但它确实非常简单。关于效率:我并不在乎,但对于'murmur3_32' 1.你创建一个ByteBuffer来通过'fromBytesNoCopy'将字节写入'HashCode'中。 2.你在'asBytes()'中为我克隆它们,3.我创建一个'ByteBuffer'来取回你开始的两个long。一个不必要的分配和两个不必要的转换,但是不是太糟糕,我想。 – maaartinus

+0

唯一听起来像是关于这个问题的问题是'asBytes()'中的克隆,它可以通过一种新方法避免。但是我无法在'HashCode'上找到一个特别好的API来获取多个数字,就像你想要的那样。 – ColinD

+0

我相信要记住一个转换花费相当长时间的基准(但那是很久以前或者只是我的幻想)。我想'asReadOnlyByteBuffer'就够了。实际上,'HashCode'只是一个不变的'byte []',也就是'ByteString',只是非常有限而且有一些怪癖('asLong' vs'padToLong')。 – maaartinus