取决于输入字符串的间隔之间的PHP数

取决于输入字符串的间隔之间的PHP数,php,string,intervals,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

在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">
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
}


只要函数调用相同,每次都使用相同的数字。

这是我在阅读您的问题时想到的:

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');

这是我读到你的问题时想到的:

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');

我希望您正在构建负载平衡器

这里需要的是从字符串中计算a,并将其转换为数字。一个好的伪随机散列函数足以得到一个随机分布。一种解决方案可能是这样的:

<img src="7.jpg">
<img src="7.jpg">
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
}
以下方面的一些测试:

更新:如果使用
$hash
的前2个字符,然后使用
$dec%$base
而不是:


我对随机分布做了一个测试,两个函数都做了。

我希望您正在构建负载平衡器

这里需要的是从字符串中计算a,并将其转换为数字。一个好的伪随机散列函数足以得到一个随机分布。一种解决方案可能是这样的:

<img src="7.jpg">
<img src="7.jpg">
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
}
以下方面的一些测试:

更新:如果使用
$hash
的前2个字符,然后使用
$dec%$base
而不是:



我对随机分布做了一个测试,两个函数都可以。

您可以调用
rand()
函数,然后使用唯一标识符保存返回的号码(例如,您的
$url
),然后在另一个
rand()
调用之前,您可以检查,如果这个rand已经存在,那么这个rand应该在一般情况下工作还是只在每次执行脚本时工作?@Yoshi它不应该在不同的执行中生成不同的结果。如果带参数的函数调用相同,则结果相同。@JensTörnell我认为您正在寻找某种哈希函数。你为什么不用它来代替呢?@silkfire代替了什么?但是是的,很好的答案出现了,而且它们是基于散列的您可以调用
rand()
函数,然后使用唯一标识符保存返回的号码(例如,您的
$url
),然后在再次调用
rand()
之前,您可以检查,如果这个rand已经存在,那么这个rand应该在一般情况下工作还是只在每次执行脚本时工作?@Yoshi它不应该在不同的执行中生成不同的结果。如果带参数的函数调用相同,则结果相同。@JensTörnell我认为您正在寻找某种哈希函数。你为什么不用它来代替呢?@silkfire代替了什么?但是是的,很好的答案出现了,而且它们是基于散列的您可以使用从字符串生成整数散列。它很有效!伟大的如果你有时间并且想,你可以试试散列计算。更新:其他解决方案即将推出,我们也会尝试。嗯,我有进展了,不是吗?:-)@KIKOSoftware到目前为止,我认为Ruslan版本真的很难打败。@Jens Törnell:是的,使用crc32的十六进制结果并将其转换为十进制的技巧非常好。基本思想是一样的。你可以用它从字符串生成整数散列。它很有效!伟大的如果你有时间并且想,你可以试试散列计算。更新:其他解决方案即将推出,我们也会尝试。嗯,我有进展了,不是吗?:-)@KIKOSoftware到目前为止,我认为Ruslan版本真的很难打败。@Jens Törnell:是的,使用crc32的十六进制结果并将其转换为十进制的技巧非常好。基本的想法是一样的。试一下。很好!有什么陷阱吗?我认为如果只取
$hash
的前2个字符,然后使用基于整数的余数:
$dec%$base
而不是
fmod
,速度会有所提高。这应该快一点。至于随机性-理论上它应该是随机的,但我没有进行适当的测试。试过了。很好!有什么陷阱吗?我认为如果只取
$hash
的前2个字符,然后使用基于整数的余数:
$dec%$base
而不是
fmod
,速度会有所提高。这应该快一点。至于随机性——理论上它应该是随机的,但我没有进行适当的测试。