连接两个32位int以在Python中获得64位长

时间:2010-08-24 03:22:10

标签: python timestamp bit-manipulation math uniqueidentifier

我想生成64位长的int作为文档的唯一ID。

一个想法是将用户的ID(32位int)与Unix时间戳(另一个32位int)组合,形成一个唯一的64位长整数。

缩小的例子是:

合并两个4位数字00100101以形成8位数字00100101

  1. 这个方案有意义吗?
  2. 如果是,如何在Python中进行数字的“连接”?

5 个答案:

答案 0 :(得分:15)

将第一个数字左移第二个数字中的位数,然后在第二个数字中添加(或按位OR - 将+替换为|)第二个数字。

result = (user_id << 32) + timestamp

关于缩小的示例,

>>> x = 0b0010
>>> y = 0b0101
>>> (x << 4) + y
37
>>> 0b00100101
37
>>>

答案 1 :(得分:5)

foo = <some int>
bar = <some int>

foobar = (foo << 32) + bar

答案 2 :(得分:4)

这应该这样做:

(x << 32) + y

答案 3 :(得分:2)

对于下一个人(在这种情况下,我就是我)。以下是一种常规方法(对于按比例缩小的示例):

def combineBytes(*args):
    """
    given the bytes of a multi byte number combine into one
    pass them in least to most significant 
    """
    ans = 0
    for i, val in enumerate(args):
        ans += (val << i*4)
    return ans

对于其他尺寸,将4改为32或其他。

>>> bin(combineBytes(0b0101, 0b0010))
'0b100101'

答案 4 :(得分:0)

在此之前的所有答案都没有涉及合并和拆分数字。拆分和合并一样有必要。

for ($i = 0; $i < count($result); $i++)
  {
  for ($x = 0; $x < $result[$i][$x]; $x++)
    {
    // code...
    $data = $result[$i][$x];
    echo '
              <div class="col-6">
               <div class="res-cont">
                <div class="count">' . ($x + 1) . '</div>
                <h4>' . $data['title'] . '</h4>
                <p>' . $data['meta'] . '</p>
                <span>' . $data['url'] . '</span>
               </div>
              </div>
         ';
    }
  }