4

假设我有一个具有唯一键名 + 为特定客户端预设的用户列族

<?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 个最新添加的用户(创建的键)和多页布局,每个页面都显示旧键

我目前找到的唯一选择是使用 phpcassa 的 uuid

uuid1()根据当前时间和机器的 MAC 地址生成 UUID。

  • 优点:如果您希望能够按创建时间对 UUID 进行排序,这很有用。
  • 缺点:潜在的隐私泄露,因为它揭示了它是在哪台计算机上以及在什么时间生成的。
  • 可能发生冲突:如果在同一台机器上同时(100 ns 内)生成两个 UUID。(或其他一些不太可能的边缘情况。)

uuid2()似乎不再使用了。

uuid3()通过获取您在某个命名空间(例如 URL、域名等)中选择的任意名称的 MD5 哈希来生成 UUID。

  • 优点:提供了一种将 UUID 块分配给不同命名空间的好方法。很容易从名称中重现 UUID。
  • 缺点:如果您已经有了唯一的名称,为什么还需要 UUID?
  • 可能发生冲突:如果您在命名空间中重用名称,或者存在哈希冲突。

uuid4()生成一个完全随机的 UUID。

  • 优点:没有隐私问题。不必生成唯一名称。
  • 缺点:UUID 没有结构。
  • 可能发生冲突:如果您使用了错误的随机数生成器,重复使用随机种子,或者非常非常不走运。

uuid5()与 相同uuid3(),除了使用 SHA-1 哈希而不是 MD5。官方首选超过uuid3().

但这意味着我必须重写一些部分+获得碰撞的可能性。

有没有我没想到的聪明技巧?

4

1 回答 1

3

首先,关于 UUID,如果您打算使用 uuid1() 或 uuid4()(无论如何,这些都是唯一真正被使用的),则无需担心冲突。这种事件发生的概率是天文数字的低。别担心。

要获取最近添加的 30 个键(以及分页功能),您实际上是在谈论时间序列数据。这是Cassandra 时间序列的一个很好的介绍。您可以使用时间戳或 v1 UUID 作为列名,并使用唯一键作为列值。如果您选择使用 v1 UUID 作为唯一键,您可以直接将它们放在列名中。那时,您只是在 Cassandra 中处理正常的时间序列数据和分页。

于 2011-11-24T04:03:52.560 回答