如何在PHP中以十进制string的forms生成随机的64位值

Oauth需要一个随机的64位无符号数字,以十进制格式编码为ASCIIstring。 你们可以帮我实现这个与PHP? 谢谢

你可以使用两个32位数字,四个16位数字等

PHP有rand()和mt_rand(),但它们提供的随机位数不是标准规定的(尽pipe它们可以分别在getrandmax()和mt_getrandmax()的帮助下查询。

所以你简单的赌注就是生成64个随机比特并逐一设置它们。

至于使用64位整数,我build议使用GMP库,因为它有一个很好的function范围来帮助你。

你可以创build一个数字,在连续的位置上调用64个gmp_setbit() ,然后使用gmp_strval()将其转换为一个string。

这是一个非常有趣的问题(如何在PHP中创build任意长度的随机数的十进制表示,不使用可选的扩展名)。 这是解决scheme:

步骤1:任意长度的随机数

// Counts how many bits are needed to represent $value function count_bits($value) { for($count = 0; $value != 0; $value >>= 1) { ++$count; } return $count; } // Returns a base16 random string of at least $bits bits // Actual bits returned will be a multiple of 4 (1 hex digit) function random_bits($bits) { $result = ''; $accumulated_bits = 0; $total_bits = count_bits(mt_getrandmax()); $usable_bits = intval($total_bits / 8) * 8; while ($accumulated_bits < $bits) { $bits_to_add = min($total_bits - $usable_bits, $bits - $accumulated_bits); if ($bits_to_add % 4 != 0) { // add bits in whole increments of 4 $bits_to_add += 4 - $bits_to_add % 4; } // isolate leftmost $bits_to_add from mt_rand() result $more_bits = mt_rand() & ((1 << $bits_to_add) - 1); // format as hex (this will be safe) $format_string = '%0'.($bits_to_add / 4).'x'; $result .= sprintf($format_string, $more_bits); $accumulated_bits += $bits_to_add; } return $result; } 

在这一点上,调用random_bits(2048)会给你2048个随机位,作为一个hex编码的string,没问题。

第二步:任意精度的基础转换

math很难,所以这是代码:

 function base_convert_arbitrary($number, $fromBase, $toBase) { $digits = '0123456789abcdefghijklmnopqrstuvwxyz'; $length = strlen($number); $result = ''; $nibbles = array(); for ($i = 0; $i < $length; ++$i) { $nibbles[$i] = strpos($digits, $number[$i]); } do { $value = 0; $newlen = 0; for ($i = 0; $i < $length; ++$i) { $value = $value * $fromBase + $nibbles[$i]; if ($value >= $toBase) { $nibbles[$newlen++] = (int)($value / $toBase); $value %= $toBase; } else if ($newlen > 0) { $nibbles[$newlen++] = 0; } } $length = $newlen; $result = $digits[$value].$result; } while ($newlen != 0); return $result; } 

这个function将会像广告一样工作,例如尝试base_convert_arbitrary('ffffffffffffffff', 16, 10) == '18446744073709551615'base_convert_arbitrary('10000000000000000', 16, 10) == '18446744073709551616'

把它放在一起

 echo base_convert_arbitrary(random_bits(64), 16, 10); 

您是否自己构buildOAuth适配器? 如果是这样,你可能要重新考虑。 有很多很好的OAuth库,其中一个来自PECL , 一个来自PEAR , 另一个来自Zend Framework , 另一个来自 Google Code 。 我和前三名一起工作,他们都很体面。

如果你真的想自己做,你可能会面临一个问题。 除非在64位平台上编译,否则PHP不能用64位数字来思考,或者你已经安装了高级math扩展。 这将使得十进制表示一个64位的数字非常困难。 它看起来像我上面链接的许多库完全忽略格式要求 ,只需使用原始的MD5散列。 以下是来自ZF适配器的代码:

 /** * Generate nonce * * @return string */ public function generateNonce() { return md5(uniqid(rand(), true)); } 

他们看起来像是在没有互操作性问题的情况下逃脱。

Interesting Posts