好的,所以我试图为我在JS / Node中开发的系统创建一个后端;我遇到的问题是我的generateID
函数似乎无法在PHP中正确复制?
JS函数是:
// To make id smaller we get microseconds count from more recent date
var start = Date.UTC(2012, 12, 21, 12, 0, 0, 0) * 1000
// Prefix with number, it reduces chances of collision with variable names
// (helpful if used as property names on objects)
, prefix = String(Math.floor(Math.random() * 10))
// Make it more unique
, postfix = Math.floor(Math.random() * 36).toString(36)
, abs = Math.abs;
module.exports = function (time = now()) {
return prefix + abs(time - start).toString(36) + postfix;
};
我尝试替换的PHP版本是:
$start = strtotime('2012-12-21 12:00:00');
$prefix = (string)(floor(rand() * 10));
$postfix = base_convert(floor(rand() * 36), 10, 36);
return $prefix.base_convert(abs(time() - $start), 10, 36).$postfix;
结果与我截然不同,使用Node可以得到ID,例如 31ztgtlke4ga ,但是在PHP版本中,我得到的是 156094750003e9y5v2zjh700
答案 0 :(得分:2)
这将打印样本结果。
$start = strtotime('2012-12-21 12:00:00', time());
$prefix = rand(0, 10);
$postfix = base_convert(rand(0, 36), 10, 36);
echo $prefix.base_convert(abs(time() - $start * 1000) * 1000, 10, 36).$postfix;
Javascript random和php rand功能不同。 Javascript random生成一个介于0和1之间的浮点值,尽管php生成一个介于min和max之间的整数值,该整数值作为参数给出。
希望此解决方案可以为您提供帮助。
顺便说一句,你犯了一个错误。
在您的js代码中,
var start = Date.UTC(2012, 12, 21, 12, 0, 0, 0) * 1000
此行不正确。
Date.UTC函数生成一个基于毫秒的时间戳,与Date.now()函数相同。
您可以删除*1000。在这种情况下,您也必须在php代码中也删除* 1000。
因此php行将如下所示。
echo $prefix.base_convert(abs(time() - $start) * 1000, 10, 36).$postfix;