UUID сортировка кассандры? - PullRequest
4 голосов
/ 23 ноября 2011

Допустим, у меня есть семейство пользовательских столбцов с уникальным именем ключа + предустановкой для конкретного клиента

<?php 
uniqid ("serverA");//generate something like; serverA4b3403665fea6
?>

Я могу выбрать их по вторичным индексам и т. Д., Например: (пример дня рождения от phpcassa)

$column_family = new ColumnFamily($conn, 'Indexed1');
$index_exp = CassandraUtil::create_index_expression('birthdate', 1984);
$index_clause = CassandraUtil::create_index_clause(array($index_exp));
$rows = $column_family->get_indexed_slices($index_clause);
// returns an Iterator over:
//    array('winston smith' => array('birthdate' => 1984))

foreach($rows as $key => $columns) {
    // Do stuff with $key and $columns
    Print_r($columns)
}

Однако я хочу только запрос, имеющий 30 последних добавленных пользователей (созданных ключей) на страницу и многостраничный макет, на каждой странице показаны более старые ключи

Единственный вариант, который я сейчас нашел, - это использование uuid из phpcassa

uuid1() генерирует UUID на основе текущего времени и MAC адрес машины.

  • Плюсы: полезно, если вы хотите иметь возможность сортировать ваши UUID по времени создания.
  • Минусы: потенциальная утечка конфиденциальности, поскольку она показывает, на каком компьютере она была создана и в какое время.
  • Возможны коллизии: если два UUID генерируются в одно и то же время (в течение 100 нс) на одном компьютере. (Или несколько других маловероятных крайние случаи.)

uuid2(), похоже, больше не используется.

uuid3() генерирует UUID, беря MD5-хэш с произвольным именем которые вы выбираете в некотором пространстве имен (например, URL, имя домена и т. д.).

  • Плюсы: Предоставляет удобный способ назначения блоков UUID различным пространствам имен. Легко воспроизвести UUID от имени.
  • Минусы: если у вас уже есть уникальное имя, зачем вам UUID?
  • Возможны коллизии: если вы повторно используете имя в пространстве имен или если произошла коллизия хешей.

uuid4() генерирует совершенно случайный UUID.

  • Плюсы: никаких проблем с конфиденциальностью. Не нужно генерировать уникальные имена.
  • Минусы: нет структуры для UUID.
  • Возможны коллизии: если вы используете плохой генератор случайных чисел, повторно используете случайное начальное число или вам очень, очень не повезло.

uuid5() совпадает с uuid3(), за исключением использования хеша SHA-1. MD5. Официально предпочтительнее, чем uuid3().

Но это означает, что мне нужно переписать некоторые части + получить возможность столкновения.

Есть ли умные хаки, о которых я не думал?

1 Ответ

3 голосов
/ 24 ноября 2011

Во-первых, что касается UUID, вам не нужно беспокоиться о коллизиях, если вы планируете использовать uuid1 () или uuid4 () (это единственные, которые действительно используются в любом случае).Вероятность такого события астрономически мала.Не беспокойтесь об этом.

Для получения 30 последних добавленных ключей (наряду с возможностями подкачки) вы действительно говорите о данных временных рядов.Вот хорошее введение в серию времени с Кассандрой .Вы можете использовать метки времени или UUID v1 в качестве имен столбцов, а уникальные ключи - в качестве значений столбцов.Если вы решите использовать UUID v1 для уникальных ключей, вы можете просто поместить их непосредственно в имена столбцов.В этот момент вы просто имеете дело с обычными данными временных рядов и подкачкой в ​​Cassandra.

...