简单的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来生成雪碧图. 第一 ...
随机推荐
- Spearman Rank(斯皮尔曼等级)相关系数
转自:http://blog.csdn.net/wsywl/article/details/5859751 1.简介 在统计学中,斯皮尔曼等级相关系数以Charles Spearman命名,并经常用希 ...
- docker logs-查看docker容器日志
只限制最后100条的日志,并持续更新日志显示 docker logs -f --tail= CONTAINER_ID docker logs -f --tail CONTAINER_ID http ...
- 一步一步学SpringDataJpa——JpaRepository查询功能
原文地址: https://blog.csdn.net/ming070423/article/details/22086169 1.JpaRepository支持接口规范方法名查询.意思是如果在接口中 ...
- var this.value 可在任意地方 声明 类成员变量。如果可以利用在C++ 那该有多好啊
var this.value 可在任意地方 声明 类成员变量.如果可以利用在C++ 那该有多好啊
- (使用STL中的数据结构进行编程7.3.15)UVA 630 Anagrams (II)(求一个单词在字典中出现的次数)
/* * UVA_630.cpp * * Created on: 2013年11月4日 * Author: Administrator */ #include <iostream> #in ...
- Go语言之进阶篇获取文件属性
1.获取文件属性 示例: get_file_attribute.go package main import ( "fmt" "os" ) func main( ...
- easyui combobox默认选中项
今天写前端代码发现combobox还挺难搞, $("#select_Dic").combobox({ url: "http: ...
- Ios开发之Category
Category是在不改变已存在类的情况下,对其添加方法来达到对类进行功能扩展的目的. 对类功能进行拓展的时候,我们会有多种方式,比如说可以通过继承也可以进行功能扩展,但是在Category和继承上我 ...
- Mysql 使用Group 和Case When统计数据
项目是基于:thinkcmf的,新的需求是对各栏目的文章数量进行统计 SQl很简单,先根据分类ID进行分组,然后再通过CASE WHEN 再统计不同文章状态数量 ) as count , =已审核 , ...
- installers PHPManager
=== Verbose logging started: // :: Build type: SHIP UNICODE 5.00.10011.00 Calling process: C:\Progra ...