将randomID函数从JS移植到PHP

时间:2019-06-25 13:21:22

标签: javascript php

好的,所以我试图为我在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

1 个答案:

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