在c ++中生成唯一ID

Dea*_*bob 9 c++ hash

在C++中从两个(或更多)短整数生成唯一ID的最佳方法是什么?我试图唯一地识别图中的顶点.顶点包含两到四个短整数作为数据,理想情况下,ID将是它们的某种散列.优先考虑便携性和独特性,超越速度或轻松.

这里有很多很棒的答案,今晚我会尝试一下,看看哪个最适合我的问题.关于我正在做什么的几句话.

该图是来自音频文件的样本集合.我使用图形作为马尔可夫链从旧文件生成新的音频文件.由于每个顶点存储一些样本并指向另一个样本,并且样本都是短整数,因此从数据生成ID似乎很自然.将它们组合成长长的听起来不错,但也许只需要0 1 2 3这么简单就可以了generateID.不确定需要多少空间来保证唯一性,如果每个顶点存储2个16位样本,那么有2 ^ 32种可能的组合是否正确?所以如果每个顶点存储4个样本,那么有2 ^ 64种可能的组合?

特定于库和平台的解决方案与此问题并不真正相关.我不希望任何可能编译我的程序的人必须下载额外的库或更改代码以适应他们的操作系统.

Jer*_*rks 8

有时最简单的事情效果最好.

您是否可以在Vertex对象中添加一个id字段,并按照构造顺序为其分配一个数字?

static int sNextId = 0;
int getNextId() { return ++sNextId; }
Run Code Online (Sandbox Code Playgroud)


Dou*_* T. 5

一个简单的解决方案是使用64位整数,其中低16位是第一个顶点坐标,接下来的16位是第二个,依此类推.这对于您的所有顶点都是唯一的,但不是非常紧凑.

所以这里有一些半成品代码.希望我得到了演员阵容.

uint64_t generateId( uint16_t v1, uint16_t v2, uint16_t v3, uint16_t v4)
{ 
   uint64_t id;
   id = v1 | (((uint64_t)v2) << 16) | (((uint64_t)v3) << 32) | (((uint64_t)v4) << 48);
   return id;
}
Run Code Online (Sandbox Code Playgroud)

可选地,这可以通过联盟完成(来自Leon Timmermans的好主意,见评论).这样非常干净:

struct vertex
{
    uint16_t v1;
    uint16_t v2;
    uint16_t v3;
    uint16_t v4;
};

union vertexWithId
{
    vertex v;
    uint64_t id;
};

int main()
{
    vertexWithId vWithId;
    // Setup your vertices
    vWithId.v.v1 = 2;
    vWithId.v.v2 = 5;

    // Your id is automatically setup for you!
    std::cout << "Id is " << vWithId.id << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • fyi,类似于此类型的双关语是未定义的行为. (3认同)
  • 我真的认为联盟会提供一种更清洁的方式来做到这一点,但这是一个品味问题. (2认同)