首页 / 知识
关于哈希:在c中生成唯一ID
2023-04-15 12:29:00

Generating a Unique ID in c++从C中的两个(或更多)短整数生成唯一ID的最佳方法是什么?我试图唯一地标识图中的顶点。顶点包含2到4个短整数作为数据,理想情况下,ID是它们的某种哈希。相对于速度或易用性,更喜欢可移植性和独特性。 这里有很多很棒的答案,我今晚将尝试所有答案,以找出最适合我的问题的方法。关于我在做什么,再说几句话。 该图是来自音频文件的样本的集合。我将图形用作马尔可夫链,从旧文件生成新的音频文件。由于每个顶点都存储一些样本并指向另一个样本,并且这些样本都是短整数,因此从数据生成ID似乎很自然。将它们组合成很长的声音听起来不错,但是我只需要像0 1 2 3 与库和平台相关的解决方案与该问题并不真正相关。我不希望其他可能编译我的程序的人不得不下载其他库或更改代码以适合他们的操作系统。 有时候最简单的方法效果最好。 能否仅将一个id字段添加到Vertex对象并按构造顺序为其分配一个数字?
一个简单的解决方案是使用64位整数,其中低16位是第一个顶点坐标,后16位是第二个顶点坐标,依此类推。尽管不是非常紧凑,但它对于所有顶点都是唯一的。 所以这是一些半定的代码。希望我的演员表正确。
可选地,这可以通过工会来完成(Leon Timmermans的好主意,请参见评论)。这样很干净:
如果您要构建用于存储顶点的哈希表,我可以想到几种避免冲突的方法: 或者,您可以使用哈希表实现为您处理冲突(例如unordered_map / hash_map),并专注于应用程序的其余部分。 如果在Windows上,则可以使用CoCreateGUID API,在Linux上,可以使用/ proc / sys / kernel / random / uuid,也可以查看" libuuid"。 问题中" ID"的定义尚不清楚:您是否需要将其用作快速查找顶点的键?您可以为 您是否需要能够区分两个具有相同坐标(但在另一个字段中不同)的顶点对象?定义一些生成例如一系列整数,与Vertex对象的值无关。 -Fire Lancer的建议方式很多(但请注意线程安全性问题!) 在我看来,两个具有相同坐标的顶点是相同的。那么,为什么还需要一个额外的ID? 一旦您为此类型定义了"严格弱排序",就可以将其用作例如
如果您更喜欢可移植性,那么boost :: tuple很不错: 您需要一个包含4个项目的元组:
您可以这样分配:
boost元组已经支持比较,相等等,因此很容易在容器和算法中使用。 使用长时长,以便您可以存储所有4种可能性,然后将每个短时位移位: (((long long)shortNumberX)<< 0、4、8或12 请确保在转换之前先进行投射,否则数据可能会掉到头。 编辑:忘记添加,您应该将它们或在一起。 确保ID唯一的唯一方法是使ID组合比您从 获取的ID多 例如,对于2个短裤(假设为16位),应使用32位int
对于4个短裤,您将需要一个64位int,依此类推... 基本上可以确保发生其他冲突(多个事物可能具有相同的id)。 但是获取ID的另一种方法(我认为会更好)是在插入顶点时将它们分发出去:
这还具有允许您向每个顶点添加更多/不同数据的效果。但是,如果您希望创建多个2 ^ 32个顶点而不重置它,则这可能不是最佳方法。 我要说的是使用质数,
确保您没有溢出ID空间(长?长长?)。由于您有固定数量的值,所以只需要填充一些随机素数即可。不用担心生成它们,列表中有足够的可用空间让您暂时离开。 不过,我对证明有些粗略,也许有一些数学家可以将我联系起来。可能与数的唯一素数分解有关。 |
最新内容
相关内容
linux上数据库的命令?
linux上数据库的命令?,服务,系统,信息,地址,命令,密码,工具,管理,数据,单位,在Linux上用命令怎么连接数据库(linux连接oracle数据库命令)1、登linux命令dm数据库?
linux命令dm数据库?,地址,软件,时间,设备,名字,服务,位置,名称,公司,命令,linux创建dm数据库超时linux/sys下无法新建 方法如下打开c盘,在用户linux使用命令的方法?
linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,图标,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你linux存储数据命令?
linux存储数据命令?,系统,管理,数据,设备,情况,地址,工作,命令,服务,平台,Linux文件系统操作命令1、cat:可以显示文件的内容(经常和more搭配使linux数据库查找命令?
linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,在linux中如何用命令查找文件在哪使用查找命令 “find”命令允许linux数据库同步命令?
linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,DB2数据库在linux操作系统的指令有哪些?1、linux系统常用操作命令linux建立数据库命令?
linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服务,linux中在shell中怎么创建一个数据库1、以下的文章主要讲述的是linux命令进数据库?
linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,主机,linux系统mysql数据库怎么进入数据库首先确保linux下mysql安linux清空表数据命令?
linux清空表数据命令?,系统,数据,软件,名称,不了,命令,文件,电脑,地址,位置,Linux删除文件的命令?1、linux 删除文件指令:输入rd盘符名:\文件夹linux拷贝数据命令?
linux拷贝数据命令?,系统,地址,文件,数据,命令,目录,服务,基本知识,项目,密码,linux复制命令?1、在Linux中,用于复制文件和目录的命令是cp。cplinux数据库检查命令?
linux数据库检查命令?,服务,状态,地址,位置,系统,信息,命令,工作,情况,密码,在linux中,怎样查看Mysql服务运行状态?1、psaux或netstat-tlunppslinux命令进去数据库?
linux命令进去数据库?,地址,服务,名字,系统,数据库,工具,基础,工作,管理,网络,linux系统mysql数据库怎么进入数据库(linux进入mysql数据库命令