2014-11-30 4 views
1

Я пытаюсь понять, какой алгоритм использует Cassandra для генерации хешей murmur3 составных ключей разделов. Я знаю, что могу получить значение непосредственно из CQL, но я хочу воспроизвести поведение Cassandra для любого заданного кортежа непосредственно из кода Java/scala.Алгоритм хэширования Cassandra с составными ключами

Для простых ключей разделов следующая функция вычисляет правильное значение (по крайней мере, во многих случаях, я знаю, глядя на исходный код, что это не точно):

длинной L = com.google.common.hash .Hashing.Hashing.murmur3_128(). HashString ("my-string", Charset.forName ("UTF-8")). AsLong();

Что делать, если у меня есть две колонки на ключ раздела?

Хеш конкатенации двух строк не то же самое.

+0

возможно дубликат [Murmur3 Hash Algorithm Используется в Кассандре] (http://stackoverflow.com/questions/16562427/murmur3-hash-algorithm-used-in-cassandra) – Aaron

+0

Следуйте по ссылке на поставленный выше вопрос , и посмотрите в комментариях к ответу. – Aaron

ответ

3

Спасибо, что предоставили мне более подробную информацию об алгоритме. Я написал пример кода, чтобы поделиться решением.

byte[] keyBytes; 
try(ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(bos)) {  

    String[] keys = new String[] {"key1", "key2"}; 
    for(String key : keys) { 
     byte[] arr = key.getBytes("UTF-8"); 
     out.writeShort(arr.length); 
     out.write(arr, 0, arr.length); 
     out.writeByte(0); 
    } 
    out.flush(); 
    keyBytes = bos.toByteArray(); 
} 

long hash = Hashing.murmur3_128().hashBytes(keyBytes).asLong(); 
Смежные вопросы