Php 基于两个变量在一定范围内生成整数
我正在为我的博客制作一个匿名评论系统。我需要用户从我制作的数组中随机选择一个用户名,它有600个用户名。我不能把它变成随机的,因为那样人们就不知道是不是同一个人发布了回复,所以我给了每个帖子一个1-9999之间的随机生成的密钥,使用密钥和用户ID,我想做一些计算,这样在特定的帖子中数字会保持一致。结果必须在1-600范围内 比如:Php 基于两个变量在一定范围内生成整数,php,math,Php,Math,我正在为我的博客制作一个匿名评论系统。我需要用户从我制作的数组中随机选择一个用户名,它有600个用户名。我不能把它变成随机的,因为那样人们就不知道是不是同一个人发布了回复,所以我给了每个帖子一个1-9999之间的随机生成的密钥,使用密钥和用户ID,我想做一些计算,这样在特定的帖子中数字会保持一致。结果必须在1-600范围内 比如: user_id x foo(1-9999) = bar(1-600) 谢谢。那么,你真正想要的是每张海报都有一个唯一的标识符 为什么不使用modded 600 当然
user_id x foo(1-9999) = bar(1-600)
谢谢。那么,你真正想要的是每张海报都有一个唯一的标识符 为什么不使用modded 600
当然,您还必须使用它进行一些冲突检测。您可以尝试在相关id和post键上使用md5。它提供了一个一致的32字节散列。它实际上是一个十六进制字符串,所以通过十六进制到整数的转换,你可以很容易地把它转换成一个数字
编辑:根据您的反馈。您可以将生成的int和modulas取600。您可能要查找的是一个。引用维基百科: 散列函数是将可变长度的大型数据集(称为键)映射到固定长度的较小数据集的任何算法或子例程 因此,您可以使用一个标准哈希函数,再加上模块运算,将该哈希函数的输出进一步映射到您的用户名范围,如下所示:
function anonymise($username, $post_key) {
$hash = hash("adler32", "$username/$post_key");
$hash_decimal = base_convert($hash, 16, 10);
$anonymised_id = $hash_decimal % 600;
return $usernames[$anonymised_id];
}
这将是一个随机整数,我需要一个基于ID和随机生成的postkey的常量。虽然如果我希望它们始终是常量,这将非常好,但我需要它们根据postkey进行更改。因此,将postkey连接到用户名(编辑以反映)会很酷,但我需要的结果总是在1-600之间。只是mod 600。唯一的问题是,桶大小如此之小,获得复制的机会就更高。我已经更新了我的答案。