现在的位置: 首页PHP技术 > 正文
php 将md5变成unsigned int
关键词:无 ┊ 来源: 原创收藏

背景,因为要根据用户名来分表,因为没有自己的帐号体系,都是来自于第三方的帐号,如新浪,淘宝,
所以没有userId,只有usrName,一般数据库分表的方式是根据uid或者别的整数进行取模,如uid%33,这就会产生33个表,
因为没有uid,只能对 userName转换成整数,然后进行取模

userName转换成整数,方式有很多,但是得保证每个表存储的数据量是基本相等的,因此要对userName进行散列,
散列的方式有很多种,用md5散列也是一种不错的选择。

php中没有128位的整数,所以可以用多个整数来表示。 不得不承认php的一些系统函数设计的精致,与md5有两个参数,如果第二个参数位true, 他将返回 那么 MD5 报文摘要将以原始的 16 位二进制格式返回。

把二进制格式的数据变成unsigned int就很简单了。 php中有一个pack函数,可以干这件事。

$md5str = md5($userName,true);
$abc = unpack("L4",$md5str);
$intRes = $abc[1] + $abc[2] + $abc[3] +$abc[4];
unpack("L4", $md5str); 就是把二进制数据变成 4个 unsigned int32整数

最后把 4个unsigned 相加,然后取模,可以用来分表了。

一些字符串与整数转换的参考

php处理unsigned int64

php gmp 库
mysql ip to int
浮点数的二进制表示
二进制文件与文本文件的区别

要把低位写在前面,这是为什么呢?
当整型数据超过 255 时,我们需要 2 个字节来储存。比如 2748(ABCh),则表示为:BCh 0Ah。要把低位写在前面(BCh),高位写在后面(0Ah)。
当整型数据超过 65535 时,我们就需要 4 个字节来储存。比如 439041101(1A2B3C4Dh),则表示成:4Dh 3Ch 2Bh 1Ah。当数据再大时,我们就需要 8 字节储存了。

在php中

php -r '$packed = pack('S4',1974,106,28225,32725);echo $packed;'  
xxd  a.data 
0000000: b607 6a00 416e d57f        

是因为低位在前面

相关文章
    暂无相关文章
本文由 jack 发布于 1841天 1小时 42分钟前,目前已有 2567 人浏览
欢迎大家转载分享,请注明来源及链接;商业媒体转载请获得授权,谢谢合作!
 

添加评论