Я наткнулся на вероятный ответ в Cassandra / Python от http://doanduyhai.wordpress.com/2012/07/05/apache-cassandra-tricks-and-traps/
Заказ по лексикографическому времениUUID
Cassandra обеспечивает, среди всех примитивных типов, поддержку значений UUID типа 1 (на основе времени и на сервере) и типа 4 (случайных).
Основное использование UUID (уникальный универсальный идентификатор) - получение действительно уникального идентификатора в потенциально распределенной среде.
Cassandra поддерживает UUID версии 1. Он дает вам уникальный идентификатор, объединяя MAC-адрес компьютера и число интервалов в 100 наносекунд с начала григорианского календаря.
Как видите, точность составляет всего 100 наносекунд, но, к счастью, она смешана с тактовой последовательностью для добавления случайности. Кроме того, MAC-адрес также используется для вычисления UUID, поэтому очень маловероятно, что вы столкнетесь с коллизией на одном кластере компьютеров, если только вам не нужно обрабатывать действительно очень большой объем данных (не забывайте, что не все являются Twitter или Facebook) .
Одним из наиболее подходящих вариантов использования UUID, особенно TimeUUID, является его использование в качестве ключа столбца. Поскольку ключи столбцов Cassandra отсортированы, мы можем воспользоваться этой возможностью, чтобы иметь естественный порядок для наших семейств столбцов.
Проблема со стандартным com.eaio.uuid.UUID, предоставленным клиентом Hector, заключается в том, что с ним нелегко работать. В качестве идентификатора вам может понадобиться перенести это значение с сервера на уровень представления, и это все получится.
По сути, com.eaio.uuid.UUID переопределяет toString () для получения строкового представления UUID. Однако это строковое форматирование не может быть отсортировано лексикографически…
Ниже приведены некоторые значения TimeUUID, сгенерированные последовательно:
8e4cab00-c481-11e1-983b-20cf309ff6dc at some t1
2b6e3160-c482-11e1-addf-20cf309ff6dc at some t2 with t2 > t1
“2b6e3160-c482-11e1-addf-20cf309ff6dc”.compareTo(“8e4cab00-c481-11e1-983b-20cf309ff6dc”)
дает -6, что означает «2b6e3160-c482-11e1-addf-20cf309ff6dc» меньше / раньше «8e4cab00-c481-11e1-983b-20cf309ff6dc» неверно.
Текущее текстовое отображение TimeUUID разделено следующим образом:
time_low – time_mid – time_high_and_version – variant_and_sequence – node
Если мы изменим порядок, начиная с time_high_and_version, мы можем затем отсортировать его лексикографически:
time_high_and_version – time_mid – time_low – variant_and_sequence – node
Класс полезности указан ниже:
public static String reorderTimeUUId(String originalTimeUUID)
{
StringTokenizer tokens = new StringTokenizer(originalTimeUUID, "-");
if (tokens.countTokens() == 5)
{
String time_low = tokens.nextToken();
String time_mid = tokens.nextToken();
String time_high_and_version = tokens.nextToken();
String variant_and_sequence = tokens.nextToken();
String node = tokens.nextToken();
return time_high_and_version + '-' + time_mid + '-' + time_low + '-' + variant_and_sequence + '-' + node;
}
return originalTimeUUID;
}
TimeUUID становятся:
11e1-c481-8e4cab00-983b-20cf309ff6dc
11e1-c482-2b6e3160-addf-20cf309ff6dc
Теперь мы получаем:
"11e1-c481-8e4cab00-983b-20cf309ff6dc".compareTo("11e1-c482-2b6e3160-addf-20cf309ff6dc") = -1