简单的BSON OID生成实现
简单的OID生成测试实现,只是简单的用用,切勿用于生产环境。
/* 应该使用大端序的,这里没有做转换 * ObjectId是12-byte BSON类型,其结构为: * * 4-byte 值为Unix时间戳, * 3-byte 主机标识, * 2-byte 进程ID * 3-byte 计数值 */ #include <stdio.h> #include <stdlib.h> #include <time.h> #ifdef _WIN32 #include <process.h> #include <Windows.h> #else #include <unistd.h> #include <sys/utsname.h> #endif /* 全局的主机标识(这个值可采用主机名散列得到) */ static unsigned char host[4] = {0,0,0,0}; /* 全局计数器(进程一个,要避免访问冲突,当前没有考虑) */ static int counter = 0; /* 进程ID值 */ static unsigned short pid = 0; // 简单的将主机名进行散列 void hashhostname(const char* hostname) { host[0] = 0x41; host[1] = 0xC6; host[2] = 0x4E; while(*hostname){ unsigned char v = *(hostname++); host[0] += v >> 2; host[1] += v >> 3; host[2] += v >> 4; } } void create_oid() { time_t t = time(NULL); unsigned char oid[12]; *((int*)oid) = (int)t; oid[4] = host[0]; oid[5] = host[1]; oid[6] = host[2]; oid[7] = pid; oid[8] = pid >> 8; oid[9] = counter; oid[10] = counter >> 8; oid[11] = counter >> 16; // 输出 ++counter; counter &= 0xffffff; int i=0; while(i<12){ printf("%02X",oid[i++]); } putchar('\n'); } int main() { // 1、初始化主机标识和进程ID #ifdef _WIN32 char buffer[512]; DWORD buflen = 512; GetComputerNameA((LPSTR)buffer,&buflen); buffer[511] = '\0'; puts(buffer); hashhostname(buffer); pid = (unsigned short)_getpid(); #else struct utsname utn; if(uname(&utn) < 0 ){ perror("uname"); return 0; }else{ printf(" sysname:%s\n nodename:%s\n release:%s\n version:%s\n machine:%s\n \n", utn.sysname, utn.nodename, utn.release, utn.version, utn.machine); hashhostname(utn.nodename); } pid = (unsigned short)getpid(); #endif puts("-----------------------"); printf(" host=[%hhx,%hhx,%hhx]\n",host[0],host[1],host[2]); printf(" pid = %hx\n",pid); puts("-----------------------"); counter = 0xfffffe; create_oid(); create_oid(); create_oid(); create_oid(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2015-06-26 关于linux中文乱码的问题。
2015-06-26 关于ubuntukylin安装后界面中英文混杂的问题
2015-06-26 网络数据包发送工具PacketSender中文源码