简单的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;
}

简单的BSON OID生成实现的更多相关文章

  1. 攻城狮在路上(壹) Hibernate(四)--- 对象标识符(OID)生成机制

    Hibernate使用对象标识符(OID)来建立内存中对象和数据库表中记录的对应关系,对象的OID和数据库的主键对应.为了保证OID的唯一性和不可变性,应该让Hibernate来为OID赋值.Hibe ...

  2. hibernate多对多 一对多 及简单入门 主键生成策略

    Hibernate简单使用 入门 通过hibernate的 一对多 多对多轻松看懂hibernate配置 (不使用注解) hibernate对jdbc访问数据库的代码进行轻量级封装,简化重复代码 减少 ...

  3. C#简单实现动态数据生成Word文档并保存

    今天正好有人问我,怎么生成一个报表式的Word文档. 就是文字的样式和位置相对固定不变,只是里面的内容从数据中读取. 我觉得类似这种的一般用第三方报表来做比较简便.但既然要求了Word,只好硬着头皮来 ...

  4. java(itext) 一个很简单的PDF表格生成工具

    先上个效果图 因为做的项目涉及到数据预测,其中有大量打印业务来支撑实体店的运营,因为注重的是数据,要求简洁,清晰,所以写了个很简单也很实用的工具类. 如果需要编写样式或者插入背景,都可以查阅itex官 ...

  5. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)

    一.Django中的缓存: 前戏: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一 ...

  6. Flink数据流图的生成----简单执行计划的生成

    Flink的数据流图的生成主要分为简单执行计划-->StreamGraph的生成-->JobGraph的生成-->ExecutionGraph的生成-->物理执行图.其中前三个 ...

  7. 简单的powershell 批量生成身份证复印件

    用Powshell 脚本批量完成,代码比较简单,出生日期,图片我都没有改,图片用于测试,附件. cls; $path = Split-Path -Parent $MyInvocation.MyComm ...

  8. Android:随机生成算数四则运算简单demo(随机生成2~4组数字,进行加减乘除运算)

    首先创建一个新的Android工程,下面是页面布局: Java代码: 我们先来分析一下如何完成的步骤: 1.首先,先完成生成随机数.(包括随机生成几组数字,范围为多少的数字,四则运算符号等): 2.要 ...

  9. 简单的使用gulp生成雪碧图

    有一个在线工具:https://www.toptal.com/developers/css/sprite-generator.生成雪碧图是极其方便的. 现在呢,我们来试试用gulp来生成雪碧图. 第一 ...

随机推荐

  1. Asp.netMVC中Html.Partial,RenderPartial,Action,RenderAction区别和用法

    https://www.2cto.com/kf/201702/602449.html Partial 和RenderPartial: 这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传 ...

  2. spring boot成功启动后访问报错404的问题

    Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as ...

  3. N体运动的程序模拟

    这依然是与<三体>有关的一篇文章.空间中三个星体在万有引力作用下的运动被称之为三体问题,参见我的上一篇文章:三体运动的程序模拟.而这一节,对三体问题进行了扩展,实现了空间中N个星体在万有引 ...

  4. tensorflow报错屏蔽的方法

    之前是报这样的错: OpKernel ('op: "BestSplits" device_type: "CPU"') for unknown op: BestS ...

  5. 一种模块化开发的目录结构和部署tips

    开发环境 开发态目录结构类似: 然后用express的static,将上下文映射到static那级目录上,比如访问: http://ip:5000/employee/employeeList.html ...

  6. sql server 由于登入失败而无法启动服务

    到控制面板——管理工具——服务,找到mssqlserver这个服务,在属性里把登陆帐户改成你目前登录windows的帐户或选择本地系统账户再重新启动服务就好了

  7. AI 经典书单 | 人工智能学习该读哪些书

    转载 2018年01月16日 00:00:00   人工智能相关岗位中,涉及到的内容包含: 算法.深度学习.机器学习.自然语言处理.数据结构.Tensorflow.Python .数据挖掘.搜索开发. ...

  8. Nginx网站常见的跳转配置实例

    相信大家在日常运维工作中如果你用到nginx作为前端反向代理服务器的话,你会对nginx的rewrite又爱又恨,爱它是因为你搞定了它,完成了开发人员的跳转需求后你会觉得很爽,觉得真的很强大,恨它是因 ...

  9. Java-JUC(八):使用wait,notify|notifyAll完成生产者消费者通信,虚假唤醒(Spurious Wakeups)问题出现场景,及问题解决方案。

    模拟通过线程实现消费者和订阅者模式: 首先,定义一个店员:店员包含进货.卖货方法:其次,定义一个生产者,生产者负责给店员生产产品:再者,定义一个消费者,消费者负责从店员那里消费产品. 店员: /** ...

  10. VS2013开发asmx接口根据ID查询对象

    代码如下 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syst ...