注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

yu.chen的博客

坚持到底就是胜利

 
 
 

日志

 
 
关于我

喜欢数学, 喜欢编程,喜欢开发系统,喜欢逆向工程,喜欢欣赏开源前辈的代码

网易考拉推荐

学习rabbit_guid.erl源码文件  

2012-11-23 08:23:54|  分类: rabbitmq |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
背景:
rabbit_guid.erl文件是用于生成随机数的。
自己的项目的随机数生成是依赖random模块种子是now,位数也很短,随机性不好,所以想看看rabbitmq是如何生成随机数的。
之前还遇到过一个问题,在一个cluster中如何保证某台机器的随机数是唯一的,要求是不能依赖于mnesia数据库同步各个节点的生成,因为依赖mnesia(或者其他数据库lock)的结果是生成随机数的代价过高。
看这个文件的时候,发现作者也考虑到了刚才提到的cluster中唯一的问题,保证了唯一性。

代码学习:
这份文件仅有3页,100行左右的代码长度。
确保唯一性的是通过其算法实现的。
函数fresh()是算法的核心部分。这个函数的返回结果是一个term,包括三个元素,第一个是是个基数(从本机文件中提取),第二个是节点名称,第三个是系统生成的ref值。这三个元素的组合可以保证组合在cluster中是唯一的。
理由是:
1. 由于第二个元素是节点名称,所以在节点这个层面是唯一的。
2. 第一个元素是文件系统中提取的,而且在rabbit_guid的init阶段就更新了这个文件,保证了这个元素,在节点每次启动时,都是唯一的。
3. 第三个元素是erlang产生的随机数,他保证了不同process调用rabbit_guid接口是会生成的ref是唯一的,这个唯一性是由make_ref保证的

函数gen/0,函数gen_secure/0是模块的两个外部接口函数,利用上述fresh/0函数生成的term转换卫binary输出。
两者差别是后者的生成步骤中最后使用了md5,保证生成的值,是无法预测下一个的,因为md5把结果序列打散了。而gen/0没有这个md5步骤,所以速度较快,但是预测的,只要知道前一个结果,就可以阅读算法,确定下一个值。
  评论这张
 
阅读(232)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018