简单的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;
}
												
											简单的BSON OID生成实现的更多相关文章
- 攻城狮在路上(壹) Hibernate(四)--- 对象标识符(OID)生成机制
		
Hibernate使用对象标识符(OID)来建立内存中对象和数据库表中记录的对应关系,对象的OID和数据库的主键对应.为了保证OID的唯一性和不可变性,应该让Hibernate来为OID赋值.Hibe ...
 - hibernate多对多  一对多 及简单入门  主键生成策略
		
Hibernate简单使用 入门 通过hibernate的 一对多 多对多轻松看懂hibernate配置 (不使用注解) hibernate对jdbc访问数据库的代码进行轻量级封装,简化重复代码 减少 ...
 - C#简单实现动态数据生成Word文档并保存
		
今天正好有人问我,怎么生成一个报表式的Word文档. 就是文字的样式和位置相对固定不变,只是里面的内容从数据中读取. 我觉得类似这种的一般用第三方报表来做比较简便.但既然要求了Word,只好硬着头皮来 ...
 - java(itext) 一个很简单的PDF表格生成工具
		
先上个效果图 因为做的项目涉及到数据预测,其中有大量打印业务来支撑实体店的运营,因为注重的是数据,要求简洁,清晰,所以写了个很简单也很实用的工具类. 如果需要编写样式或者插入背景,都可以查阅itex官 ...
 - Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)
		
一.Django中的缓存: 前戏: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一 ...
 - Flink数据流图的生成----简单执行计划的生成
		
Flink的数据流图的生成主要分为简单执行计划-->StreamGraph的生成-->JobGraph的生成-->ExecutionGraph的生成-->物理执行图.其中前三个 ...
 - 简单的powershell   批量生成身份证复印件
		
用Powshell 脚本批量完成,代码比较简单,出生日期,图片我都没有改,图片用于测试,附件. cls; $path = Split-Path -Parent $MyInvocation.MyComm ...
 - Android:随机生成算数四则运算简单demo(随机生成2~4组数字,进行加减乘除运算)
		
首先创建一个新的Android工程,下面是页面布局: Java代码: 我们先来分析一下如何完成的步骤: 1.首先,先完成生成随机数.(包括随机生成几组数字,范围为多少的数字,四则运算符号等): 2.要 ...
 - 简单的使用gulp生成雪碧图
		
有一个在线工具:https://www.toptal.com/developers/css/sprite-generator.生成雪碧图是极其方便的. 现在呢,我们来试试用gulp来生成雪碧图. 第一 ...
 
随机推荐
- Makefile:160: recipe for target 'all' failed (Ubuntu 16.06 + Opencv3.2)解决办法
			
前言 之前一直用的opencv 好好的,今天安装了anaconda之后,python中的opencv不能用了,即便是拷贝cv2.so之后也是不能用,问题如下: 根本原因 安装anaconda之后,很多 ...
 - 升级pip后出现 ImportError: cannot import name main
			
原文链接 https://blog.csdn.net/accumulate_zhang/article/details/80269313 在Ubuntu中,升级了pip,再次使用pip 安装相关的 ...
 - 从客户端(ctl00$ContentPlaceHolder1$result="<?xml version="1.0" ...")中检测到有潜在危险的 Request.Form 值。
			
ylbtech-Error-WebForm:从客户端(ctl00$ContentPlaceHolder1$result="<?xml version="1.0" . ...
 - gamma函数及相关其分布
			
神奇的gamma函数(上) 神奇的gamma函数(下) gamma函数的定义及重要性质 \[\Gamma(x)=\int_0^{\infty}t^{x-1}e^{-t}dt\] \[\Gamma(x+ ...
 - C语言中将0到1000的浮点数用强制指针类型转换的方式生成一幅图像
			
搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量.一幅图像可以看做是一个二维整型数组.这里我会生成一个float数组,其数组大 ...
 - [leetcode]Reverse Linked List II @ Python
			
原题地址:https://oj.leetcode.com/problems/reverse-linked-list-ii/ 题意: Reverse a linked list from positio ...
 - 为Linux操作系统所在的logical volumn扩容
			
感谢Lieven和Tom的协助,这个问题才得以解决.我在这里把解决问题的步骤总结一下,帮助自己学习. 问题描述 =========== 笔者有一台linux的物理机,其上名为centos-root的l ...
 - jQuery UI全教程之一(dialog的使用教程)
			
jQuery UI目前的版本已经更新到了1.8.7.个人感觉和easyui相比起来,jQuery UI在界面的美观程度和可定制型更强一些.所以再次将一些jQuery UI组件的用法说明一下,方便日后查 ...
 - Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十四)定义一个avro schema使用comsumer发送avro字符流,producer接受avro字符流并解析
			
参考<在Kafka中使用Avro编码消息:Consumer篇>.<在Kafka中使用Avro编码消息:Producter篇> 在了解如何avro发送到kafka,再从kafka ...
 - (转)Unity3D工程版本管理方案
			
自:http://blog.dou.li/unity3d%E5%B7%A5%E7%A8%8B%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86%E6%96%B9%E6%A1%88 ...