间隔取决于输入字符串的PHP编号

时间:2016-06-17 07:43:14

标签: php string intervals

在php中,我可以这样做:

echo rand(5, 15);

它会给我一个5到15之间的数字,每次都不同。

静态编号取决于输入字符串

echo my_static_number(5, 15, 'some/custom_string');

我仍然想要一个介于5到15之间的数字。区别在于我希望根据第三个参数(字符串)计算它。

  • 允许输出数字5,6,7,8,9,10,11,12,13,14,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">
每次只要函数调用相同,

每次都相同。

2 个答案:

答案 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