日期:2014-05-16  浏览次数:20564 次

php生成32进制8位字符,减轻数据库唯一字段
一般在数据库里唯一字段我们用AUTO_ID或者CRC32或者MD5
AUTO_ID    10进制根据数据列长度,一般是初学者用,应为在高级应用里不灵活
CRC32 16进制8位,很直观,但是重复几率要比 MD5高,
MD5   16进制32位,不直观,太占数据库唯一字段,数据选择压力大。
最近2天一直在研究如何PHP做一个既有MD5的唯一能力又减少位数用在数据库开发里
想到压缩MD5为32进制8位,下面是函数,希望大家测试或者给点意见,或者有更灵活的方法

function only( $a )
{
for
(
$a = md5( $a, true ),
$s = '0123456789ABCDEFGHIJKLMNOPQRSTUV',
$d = '',
$f = 0;
$f < 8;
$g = ord( $a[ $f ] ),
$d .= $s[ ( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F ],
$f++
);
return $d;
}

在某些人提示我怎么不用随机生成唯一码,我当时就跟彻底不说了,

一般 当用户提交信息 我喜欢是 md5( join( $_POST ) )   16进制32位不说了

现在就用 only( join( $_POST ) ) 32进制8位 。。。。你懂的

该函数基于MD5的2进制16长度的字符上将其压缩为32进制8位,分散都同样很高

在对于 4 & 4 , 3 & 1 , 1 & 3 这样可能返回同一个数字有处理防止生成一样的字符

下面是生成的唯一码


NWSPASW7 EQ366BO7 CDWMSM3Z 7VUMMIBF BWXOYLRN EKKRHSLL WF69SDWZ KJJU7R7U
MBYMGQDM UZWTBSLX GAKOV9BX 5QJCVBS3 IJDD9GPT XSZKPVZY 2QBRMZWO JDAPQMCU
RYWLO3ED YYBTHSCL 2ECJCWLK EUH7TQOF W6QXVTIC 3FDZASVC OPWJZTQ3 FJWYRVYF