hash2int

/**
* 计算一个字符串的md5折算成int返回
* @param type $str
* @return type
*/
function hash2int($str) {
$md5str = md5($str, true);
$one = unpack('l', substr($md5str, 0, 4));
$two = unpack('l', substr($md5str, 4, 4));
$three = unpack('l', substr($md5str, 8, 4));
$four = unpack('l', substr($md5str, 12, 4));
return current($one) + current($two) + current($three) + current($four);
}

思考一:这个函数有没有优化的空间,直接上代码

function hash2int2($str) {
$md5str = md5($str, true);
$arr = unpack('la/lb/lc/ld', $md5str);
return array_sum($arr);
}

效率大约是上一个函数的4倍(当然这种程度的优化对于一个设计到db等的大项目的效率影响很小)

思考二:pack/unpack在php中的使用

首先熟悉几个概念

  计算机当中通常采用的自己存储方式(字节序)有:大端和小端
大端序(网络字节序):①多字节传输时,先传高字节;②存储时高位字节在低地址
小端序:①多直接传输时,先传低位字节;②存储时低位字节放在低地址
栗子:0x12345678
大端序:0x12 0x34 0x56 0x78
小端序:0x78 0x56 0x34 0x12
主机字节序:本机的字节序

pack的参数:

格式字符翻译

a -- 将字符串空白以 NULL 字符填满

A -- 将字符串空白以 SPACE 字符 (空格) 填满

h -- 16进制字符串,低位在前以半字节为单位

H -- 16进制字符串,高位在前以半字节为单位

c -- 有符号字符

C -- 无符号字符

s -- 有符号短整数 (16位,主机字节序)

S -- 无符号短整数 (16位,主机字节序)

n -- 无符号短整数 (16位, 大端字节序)

v -- 无符号短整数 (16位, 小端字节序)

i -- 有符号整数 (依赖机器大小及字节序)

I -- 无符号整数 (依赖机器大小及字节序)

l -- 有符号长整数 (32位,主机字节序)

L -- 无符号长整数 (32位,主机字节序)

N -- 无符号长整数 (32位, 大端字节序)

V -- 无符号长整数 (32位, 小端字节序)

f -- 单精度浮点数 (依计算机的范围)

d -- 双精度浮点数 (依计算机的范围)

x -- 空字节

X -- 倒回一位

@ -- 填入 NULL 字符到绝对位置

关于pack和unpack推荐3篇博客,写得非常好

http://my.oschina.net/goal/blog/195749

http://my.oschina.net/goal/blog/202378

http://my.oschina.net/goal/blog/202381

后续我会结合自己项目当中php跟C模块通过Nshead协议的交互来补充这块

思考三:有各种数字想到了ip2long这个函数

php中的ip2long函数的原理:将每一段看成256进制的数字

function ip2int($ip) {
list($ip1, $ip2, $ip3, $ip4) = explode(".", $ip);
return ($ip1 << ) | ($ip2 << ) | ($ip3 << ) | ($ip4);
}

问题就出现了,2int之后可能出现负数,所以我们一般使用 sprintf('%u',ip2long($ip))

php是只支持有符号的整数的,32 64的系统所支持最大的整型数是不同的,所以在不同操作系统使用ip2long的时候得到的结果可能是不一样的,这个问题值得注意

可以用sprintf('%u',ip2long($ip)),需要注意的是,sprintf返回的都是字符串

function dotip2uint($cip) {
$dotips = explode('.', $cip, 4);
return intval($dotips[0]) * 16777216 + intval($dotips[1]) * 65536 + intval($dotips[2]) * 256 + intval($dotips[3]);
}

由项目中一个hash2int函数引发的思考的更多相关文章

  1. 转:一个Sqrt函数引发的血案

    转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html 源码下载地址:http://diducoder.com/sotr ...

  2. 一个Sqrt函数引发的血案(转)

    作者: 码农1946  来源: 博客园  发布时间: 2013-10-09 11:37  阅读: 4556 次  推荐: 41   原文链接   [收藏]   好吧,我承认我标题党了,不过既然你来了, ...

  3. 【转载】一个Sqrt函数引发的血案

    转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/sotry-about-sqrt.html 源码下载地址:http://diducoder ...

  4. 一个Sqrt函数引发的血案

    源码下载地址:http://diducoder.com/sotry-about-sqrt.html 好吧,我承认我标题党了,不过既然你来了,就认真看下去吧,保证你有收获. 我们平时经常会有一些数据运算 ...

  5. 由一个DAOHelper类引发的思考

    这是一篇发牢骚的文章,可以这么说吧.DAOHelper究竟有什么用呢?用我自己的话去理解,DAOHelper的存在正是敏捷开发的产物,即快速开发. 我们究竟能从项目中学到什么呢?有的人可能会说,从一个 ...

  6. MVC系列——一个异常消息传递引发的思考

    前言:最近在某个项目里面遇到一个有点纠结的小问题,经过半天时间的思索和尝试,问题得到解决.在此记录一下解决的过程,以及解决问题的过程中对.net里面MVC异常处理的思考.都是些老生常谈的问题,不多说, ...

  7. 由struts2中配置使用servlet引发的思考和复习

    Struts2拦截器到底拦截了什么? 关于struts2中的拦截器,首先再次理解其实只能过滤其中访问的action的映射!再者,因为struts中的action其实就是起到替代servlet作用的,所 ...

  8. Dynamics CRM中一个查找字段引发的【血案】

    摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复267或者20180311可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...

  9. Qt项目中main主函数及其作用

    http://c.biancheng.net/view/1821.html main.cpp 是实现 main() 函数的文件,下面是 main.cpp 文件的内容. #include "w ...

随机推荐

  1. iOS 获取User-Agent

    第一种方法 UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];    NSString *userAgent = [w ...

  2. android 比较完善json请求格式

    public static String getHttpText(String url) { if (MyApplication.FOR_DEBUG) { Log.i(TAG, "[getH ...

  3. Android Adapter的几个方法

    1  ListView是在什么时候设置对Adapter的数据监听的? 在setAdapter(ListAdapter adapter)中,会先取消ListView中原来的mAdapter中的数据监听( ...

  4. oc TableView 分割线(separator)部分显示问题

    问题:当TableView的cell不能显示完整个屏幕(屏幕有剩余),则没有显示cell的地方也会显示分割线,这不是我们想要的,正常情况下,如果没有cell则应没有分割线.如下图所示:左图为遇到问题, ...

  5. MPlayerX——MAC OS 最好用的播放器

    MPlayerX真是一个不错的软件,它真的可以称得上在MAC OS里最好用的播放器,它功能强大,可以播放你所知道的任何格式的视频和音频文件.他的选项非常丰富,可以自定义设置的东西很多,但又不失简洁的风 ...

  6. IntelliJ IDEA 12.1.4 解决中文乱码

    一.进入IDE Settings 里的 Appearance项,选中Override default fonts by ,把 Name 设置为 SimSun,Size 根据自己喜好设置(我一般设为 1 ...

  7. 布局 position

    position : 设置定位方式 跟『定位』相关的有一些属性,最重要的一个是『position』,它主要是设置『定位方式』. 而定位方式最重要的是设置『参照物』. 配合 position 使用的有这 ...

  8. 原 ng-include用法分析以及多标签页面的简单实现方式

    Demo:http://webenh.chinacloudsites.cn/Default/Demo2 在平时的项目开发中,应该会经常遇到上图所示的需求,就是在一个页面中有多个标签,被选中的标签颜色会 ...

  9. JAVA中的枚举小结

    枚举 将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用: 枚举基本特性 以下代码是枚举的简单使用: 使用values方法返回enum实例的数组 使用ordinal方法返回每个enum ...

  10. MySQL 系列(五) 多实例、高可用生产环境实战

    MySQL 系列(五) 多实例.高可用生产环境实战   第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 史上最屌.你不知道的数据库操作 第三 ...