在php中,我可以这样做:
echo rand(5, 15);
它会给我一个5到15之间的数字,每次都不同。
静态编号取决于输入字符串
echo my_static_number(5, 15, 'some/custom_string');
我仍然想要一个介于5到15之间的数字。区别在于我希望根据第三个参数(字符串)计算它。
现实生活中的例子
文件夹中的图片:
1.jpg
2.jpg
3.jpg
etc.
Php电话:
<img src="<?php echo get_image(1, 15, $url); ?>">
<img src="<?php echo get_image(1, 15, $url); ?>">
输出如下内容:
<img src="7.jpg">
<img src="7.jpg">
每次只要函数调用相同,每次都相同。
答案 0 :(得分:2)
这是我在阅读你的问题时想到的:
function my_static_number($min,$max,$seedStr)
{
$hash = md5($seedStr);
$length = strlen($hash);
$seed = 1234;
for ($i=0; $i<$length; $i++) $seed += ord($hash[$i]);
srand($seed);
return rand($min,$max);
}
echo my_static_number(5, 15, 'some/custom_strings');
rand()
可以播种,并且使用相同的种子,它将生成相同的随机序列。所以我对完整的字符串进行散列,将该散列的ascii值相加,并将其用作种子。
因此,您将得到随机数,但对于相同的种子字符串它们将是相同的。
此功能确实有一些限制:
思考它:这里没有真正需要使用任何随机函数:您可以使用哈希来计算半随机数。像这样:
function my_static_number($min,$max,$seedStr)
{
$hash = md5($seedStr);
$length = strlen($hash);
$number = 1234;
for ($i = 0;$i < $length;$i++) $number += ord($hash[$i]);
return $min + ($number % ($max-$min));
}
echo my_static_number(5, 15, 'some/custom_string');
答案 1 :(得分:2)
我希望您正在构建负载均衡器。
这里需要的是从字符串中计算hash并将其转换为数字。一个好的伪随机哈希函数足以让你获得随机分布。一种解决方案可能是这样的:
function my_static_number($a, $b, $str) {
$hash = hash('crc32', $str); // crc32 is probably the fastest here
$dec = hexdec($hash); // convert hash to a decimal value
$base = $b + 1 - $a; // +1 is needed to include $b as possible value
return $a + fmod($dec, $base); // get remainder from $dec / $base
}
teh playground上的一些测试:
更新:如果您取代$hash
的前2个字符,然后使用$dec % $base
代替fmod,速度可能略有提升:
function my_static_number($a, $b, $str) {
$hash = substr(hash('crc32', $str), 0, 2); // effectively produces a number between 0 and 255
$dec = hexdec($hash);
$base = $b + 1 - $a;
return $a + $dec % $base;
}
我对随机分布进行了测试,两个函数都执行reasonably well。