У меня будут таблицы C *, которые будут очень широкими. Чтобы они не стали слишком широкими, я столкнулся с такой стратегией, которая могла бы мне хорошо подойти. Он был представлен в этом видео. Bucket Your Partitions WiselyСгенерируйте хэш харда с * от многофазного первичного ключа
Хорошая вещь с этой стратегией заключается в том, что нет никакой необходимости в «просмотровом стол» (это быстро), плохая часть является то, что нужно знать максимальное количество ведер и в конечном итоге положить конец (без масштабирования). Я знаю свой максимальный размер ковша, поэтому я попробую это.
Вычисляя хэш из первичных ключей таблиц, он может использоваться как часть ведра вместе с остальными первичными ключами.
У меня есть следующий метод, чтобы быть уверенным (я думаю?), Что хэш всегда будет одинаковым для определенного первичного ключа.
Использование Guava хеширования:
public static String bucket(List<String> primKeyParts, int maxBuckets) {
StringBuilder combinedHashString = new StringBuilder();
primKeyParts.forEach(part ->{
combinedHashString.append(
String.valueOf(
Hashing.consistentHash(Hashing.sha512()
.hashBytes(part.getBytes()), maxBuckets)
)
);
});
return combinedHashString.toString();
}
причина, почему я использовать sha512, чтобы иметь возможность иметь строки с макс символами 256 (512 бит) в противном случае результат не будет таким же (как это кажется согласно моим тестам).
Я далек от того, чтобы быть хэширующим гуру, поэтому я задаю следующие вопросы.
Требование: Между различными выполнением JVM на разных узлах/машинах результат всегда должен быть одинаковым для данного первичного ключа Cassandra?
- Могу ли я полагаться на упомянутый метод для выполнения этой работы?
- Есть ли лучшее решение хэширования больших строк, чтобы они всегда приводили к одному и тому же результату для данной строки?
- Должен ли я всегда иметь хэш из строки или может быть лучший способ сделать это для первичного ключа C * и всегда производить тот же результат?
Пожалуйста, я не хочу обсуждать моделирование данных для конкретной таблицы, я просто хочу иметь стратегию ведра.
EDIT:
дорабатываться и придумал это так длина строки может быть произвольным. Что вы скажете об этом?
public static int murmur3_128_bucket(int maxBuckets, String... primKeyParts) {
List<HashCode> hashCodes = new ArrayList();
for(String part : primKeyParts) {
hashCodes.add(Hashing.murmur3_128().hashString(part, StandardCharsets.UTF_8));
};
return Hashing.consistentHash(Hashing.combineOrdered(hashCodes), maxBuckets);
}
Я как раз собирался отредактировать свой «вопрос» с лучшим решением, и он очень похож на – nicgul
oops, hit enter ... посмотреть мое обновление и рассказать мне, что вы думаете. – nicgul
BTW, отличный ответ, дает мне больше уверенности! – nicgul