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. svn(http)

    对于有些公司的运维  他确实很垃圾   所以  你一定要谨记这一点!!!

  2. C#反序化json字符串,不用区分大小写

    最近在做第三方对接的项目,接口返回的数据是json格式,并且每个字段都是小写的,而我们程序类中的属性是要求大写的:刚开始想到的是用JavaScriptSerializer,但是这个并不满足需求 就换了 ...

  3. 分享2个网址二维码API接口

    分享2个网址二维码生成API接口,用它们只需要填写好网址就能自动生成二维码,分别来自与bshare和jiathis分享工具中,如您需要就把下面的二维码生成API接口复制到你需要地方. 说明:把url= ...

  4. react学习笔记1

    # 1.hello world 学习一个语言,最好的方式,我们需要去官网去查看文档(https://facebook.github.io/react),通过JSFiddle,便可以看到最简单的demo ...

  5. memcache使用方法测试 # 转自 简单--生活 #

    <?php   //php操作memcache的使用测试总结--学习   //1 Memcache::connect;    //$memcache = new Memcache;    //$ ...

  6. SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace)

      SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace) DBA 日常管理工作中,很重要一项工作就是监视数据库文件大小,及日志文件大小.如果你管理数据库的有很 ...

  7. spring定时器(一)

    使用的是spring的quartz功能,需导入com.springsource.org.quartz.jar包. 此定时器无法重置定时时间,需要的话可查看:spring定时器(二) spring的be ...

  8. x01.Game.Main: 从零开始

    一切从零开始,一切皆有可能. 浅墨,90后,<逐梦之旅>深入浅出,堪比大师. 1.安装 DXSDK_June10.exe 或更新版本. 2.运行 vs2012,新建 VC Win32 空项 ...

  9. Mac OSX下卸载Nodejs

    有时手贱看到新版本就升级,升级后发现一堆模块不能用了,心情好慢慢调,但也有调不好的时候,只能卸载重装低版本的node了. 我的机器环境如下 1. Mac OSX 10.10.3 2. node为0.1 ...

  10. JavaScript添加、查找、删除元素的一个实例

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...