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. [Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)

    温馨提示      建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续本节内容.   ...

  2. 【译】仿Taasky的3D翻转菜单动画实现

    最终效果 最终效果 开始 首先下载并打开一个事先搭好架子的Demo,然后来分析一下.这个Demo包含一个主页和详情页,其中MenuViewController继承自UITableViewControl ...

  3. iOS 从应用中跳转至系统设置页面里的多种设置页面

    我们在开发app过程中很多时候会需要设置系统权限,这时就需要在应用中跳转至系统设置页面权限设置页面,以下是自己结合网上的资料总结的一些经验: 直接从应用中跳转至系统设置中这个应用的权限设置页面 NSU ...

  4. XML解析之SAX详解

    XML解析之SAX详解 本文属于作者原创 http://www.cnblogs.com/ldnh/ XML解析的五个步骤 1.打开文档 (void)parserDidStartDocument:(NS ...

  5. 1.9 基础知识——GP2.10 高级别的领导检查(Higher level management)

    GP2.10 Review the activities,status,and results of XXX process with highter level management and res ...

  6. WPF学习之路(十二)控件(HeaderedContent控件)

    GroupBox 用来组织多种控件的常见控件,因为是内容空间,只能直接包含一项,需要使用面板一类的中间空间. Header和Content可以是任意元素 <GroupBox> <Gr ...

  7. 0008《SQL必知必会》笔记04-子查询、联接与组合查询

    1.子查询:就是嵌套的查询,用一个查询的结果作为另一个查询的条件. 比如要列出订购了物品“RGAN01”的所有顾客的ID.姓名和联系人,需要经历以下几步 (1)从orderitems中找出订购了“RG ...

  8. MySQL binlog 组提交与 XA(两阶段提交)

    1. XA-2PC (two phase commit, 两阶段提交 ) XA是由X/Open组织提出的分布式事务的规范(X代表transaction; A代表accordant?).XA规范主要定义 ...

  9. Nginx问题定位之监控进程异常退出

    nginx在运行过程中是否稳定,是否有异常退出过?这里总结几项平时会用到的小技巧. 1. 在error.log中查看是否有signal项,如果有,看看signal是多少. 比如,这是一个异常退出的情况 ...

  10. android 导入数据(通讯录)

    接着android 中导出数据 一文,下面介绍在android中导入数据的思路: 1.将数据从文本中读取出来 2.封装处理成自己想要的对象或模型 3.将处理好的数据对象插入自己应用的数据库中 4.更新 ...