2013-06-19 29 views
1

我想知道我怎么能去创造具有相似结构的随机PHP值作为IPv6的用PHP生成随机的结构化数据

例子:2001年:将0db8:85±3:0042:与1000:8a2e:0370:7334: nc21

我可以使用mt_rand(0000,9999).":"....... and so on但是这只产生数值,而且它是多余的。有一种更简单的方法来做一个函数吗?

感谢每一个反馈信息,最后我选择去用下面的代码位

$randomString = sha1(dechex(mt_rand(0, 2147483647))); 
$token = implode(':', str_split($randomString, 4)); 

结果:

9ec0:4709:926E:4cbf:fa87:2ac3 :03da:f547:485B:6464

+0

使用['dechex()'](http://php.net/dechex),然后,实际的数值范围为4个半字节的十六进制值。 – mario

+0

你究竟在用什么?如果只是为了生成一个唯一的ID,就有['uniqid'](http://ca3.php.net/uniqid)函数。 – Tarka

+0

其产生一个完全随机的令牌 – 0111010001110000

回答

3

使用cryptografic散列函数。

md5(rand()) // eg: ccc4fd993dd07dac621455c7c924d38f 

Otherwards implodestr_split(md5(rand()), 4)用冒号返回值来创建这样的事情:

implode(':', str_split('ccc4fd993dd07dac621455c7c924d38f', 4)); 
// ccc4:fd99:3dd0:7dac:6214:55c7:c924:d38f 

取决于你要多少块具有随机使用substr截断默认情况下,他们输出的十六进制哈希值。


,这种方法不会产生真正的随机性。如果需要,真的随机数据看看巴巴的答案。

+0

与我正在建议的几乎完全相同,除了使用['uniqid()'](http://ca3.php.net/uniqid)而不是'rand()',因为它增加了一个额外的避免冲突层。 – Tarka

+0

真棒作品像这里的魅力是我做了'$ randomString = sha1(dechex(mt_rand(0,2147483647))); $ token = implode(':',str_split($ randomString,4));' – 0111010001110000

+1

@ user2293381请注意,'sha1'的输出大小为160位(= 40个十六进制字符)。 IPv6只有128位(= 32个字符)的大小。 'md5'可能更适合! – TimWolla

1

您可以生成(0xFFFF的)0和65 535之间的随机数,然后使用​​其转换为十六进制。

请注意,字符串nc21的末尾不是有效的十六进制数,因此也不是有效的IPv6地址。

+0

我知道,我只是用它作为参考。对不起, – 0111010001110000

5

避免使用rand看到str_shuffle and randomness尝试:

echo myRand(36); 

输出

023c:631e:f770:ec5b:f06b:917a:b839:4aea:45b7 

功能用于

function myRand($length, $sep = ":", $space = 4) { 
    if (function_exists("mcrypt_create_iv")) { 
     $r = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); 
    } else if (function_exists("openssl_random_pseudo_bytes")) { 
     $r = openssl_random_pseudo_bytes($length); 
    } else if (is_readable('/dev/urandom')) { 
     $r = file_get_contents('/dev/urandom', false, null, 0, $length); 
    } else { 
     $i = 0; 
     $r = ""; 
     while($i ++ < $length) { 
      $r .= chr(mt_rand(0, 255)); 
     } 
    } 
    return wordwrap(substr(bin2hex($r), 0, $length), $space, $sep, true); 
} 
+1

我可以推荐'/ dev/random'作为另一个后备? +1虽然。 – deceze

+2

'MCRYPT_RAND =/dev/random'而'MCRYPT_DEV_URANDOM'为'/ dev/urandom'因为'/ dev /随机'会在熵池耗尽后阻塞我使用'/ dev/urandom' – Baba

+0

是的,我知道,但如果mcrypt和openssl都不可用,'is_readable('/ dev/urandom')&& file_get_contents('/ dev/urandom',false,null,0,$ length)'是一个简单的回退,可能比'mt_rand'更好。 – deceze