简单的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来生成雪碧图. 第一 ...
随机推荐
- [Link]Hive资料整理
Hive SQL的编译过程 Hive学习分享 IBM Hive
- Windows平台Mysql使表名区分大小写
my.ini 里面的mysqld部分 加入 lower_case_table_names=2 [mysqld] lower_case_table_names=2 port= 3306 注: 1 ...
- [转]使用mysql profiles 来查看sql 语句执行计划
From : http://blog.csdn.net/radkitty/article/details/4632289 要使用该功能,mysql的版本必须在5.0.37版本以上.否则只能使用expl ...
- 阿里jstorm和storm区别
转自:https://www.cnblogs.com/cn-leodream/p/6497277.html 看介绍文档貌似挺好:https://github.com/alibaba/jstorm ...
- “秘书九段的故事”,要学会给自己制定一个工作N段或者技术N段
总经理要求秘书安排次日上午九点开一个会议.在这件事下,什么是任务?什么是结果? 通知到所有参会的人员,然后秘书自己也参加会议来做服务,这是“任务”.但我们想要的结果是什么呢?下面是一至九段秘书的不同做 ...
- JS 父页面调子页面(2种情况),子掉父级(1种)(转)
A :父级调用子级页面 ,非IFRAME情况,类似平级: window.open("子页面.html", "", "width=1024,height ...
- Visual Studio 2008 安装失败(“Web 创作组件”无法安装)(转)
今天安装VS2008时出现了问题,怎么都无法安装成功.装了好几次都在“Visual Studio Web 创作组件(Visual Studio Authoring Component)”的安装的时候失 ...
- 随机蕨(Random Fern)
最近在做 Zdenek Kalal 的 TLD 算法,其成果发表在CVPR 2010 上,文章的名字叫做 P-N Learning: Bootstrapping Binary Classifiers ...
- laravel 开启sql调试
打开app\Providers\AppServiceProvider.PHP,在boot方法中添加如下内容 public function boot() { //sql调试 $sql_debug = ...
- zookeeper基础知识整理
http://blog.csdn.net/pelick/article/details/7269670 http://zookeeper.apache.org/doc/trunk/javaExampl ...