将JavaScript(随机UID)代码转换为Delphi

3

我试图将JavaScript代码转换为Delphi,但是失败了。JavaScript:

/* generate random progress-id */
var uuid = "";
var i;
for (i = 0; i < 32; i++) {
  uuid += Math.floor(Math.random() * 16).toString(16);
}

...以及它的输出:

a638aa8f74e2654c725fd3cdcf2927d3

我在 Delphi 中的尝试:

function uid: String;
var
  i: Integer;
begin
  for I := 0 to 31 do begin
    result := result + IntToStr(Floor(Random * 16));
  end;
end;

我对Delphi的了解有限,所以不知道该做什么。我希望能得到一些帮助并从中学习。


1
如果你想生成一个GUID,有更好的方法可以实现(例如:使用专门用于此目的的内置函数):https://dev59.com/6nE95IYBdhLWcg3wdtqj#2300706。如果你需要以任何格式呈现,你可以使用基本字符串函数去掉连字符并将其转换为小写。 - J...
不,它不是GUID,它是一个随机的进度ID,我需要将其作为POST数据发送到某个网站。 - user3424509
2
在JavaScript中,toString(16)似乎将值转换为十六进制。如果是这种情况,您应该使用'IntToHex'而不是IntToStr - Graymatter
1
你说得对,谢谢兄弟。 - user3424509
1
@user3424509 - 它的形式完全相同(32个随机十六进制数字)。 - J...
1个回答

7

在Delphi中,函数的样子如下:

function uid: String;
var
  i: Integer;
begin
  for i := 0 to 31 do
    Result := Result + IntToHex(Random(16), 1);
end;

如果您需要一个小写的“id”——请使用AnsiLowerCase函数。

编辑

为了正确性,在上面的自制方法并不推荐——它只是JavaScript片段的字面翻译。它可能会导致冲突(而且肯定会)。

以下函数是推荐的:

function uid: String;
var
  myGuid: TGUID;
begin
  if Succeeded(CreateGUID(myGUID)) then
    Result := Format('%0.8X%0.4X%0.4X%0.2X%0.2X%0.2X%0.2X%0.2X%0.2X%0.2X%0.2X',
      [myGUID.D1, myGUID.D2, myGUID.D3,
      myGUID.D4[0], myGUID.D4[1], myGUID.D4[2], myGUID.D4[3],
      myGUID.D4[4], myGUID.D4[5], myGUID.D4[6], myGUID.D4[7]]) else
    {TODO: some error processing - something bad happened}
end;

上面小写的"id"的提示在这里也有效。

3
需要强调的是,在没有其他调用的情况下,每次运行程序时,此函数将产生相同的伪随机数序列。对于生成任何类型的UID,这显然是灾难性的。必须在程序中的某个地方调用Randomize以使用新种子初始化随机数生成器。http://docwiki.embarcadero.com/Libraries/en/System.Randomize 使用专门设计的函数CreateGuid是一个更好的选择,因为它不容易受到像这样自己编写的不完善解决方案引入的无数错误的影响。 - J...
例如... https://dev59.com/XGw05IYBdhLWcg3w_Guw 当使用天真的自制方法时,GUID冲突非常普遍。WinAPI免费提供此服务,人们必须认为这是有充分理由的。 - J...
我完全同意你的观点。实际上,我最先想到的就是使用CreateGUID。但这会导致将其转换为字符串,解析以便按照作者所需的正确方式显示它。我认为这种方式(虽然正确)会导致混淆。此外,作者没有指明“随机进度ID”需求的整个情况。他还否认他的UID是GUID(这显然是不正确的)。因此,由于问题(转换一些代码..)和提供的信息不足,我决定按字面意思回答(如我在A的顶部所述)。 - Peter Kostov
没错,你原来的回答确实正确地回答了楼主的问题——不过还是要考虑到预期的目的。另一种生成楼主所需格式字符串的方法(假设小写字母是设计要求)只需简单地使用Lowercase(StringReplace(GuidToString(myGuid), '-', '', [rfReplaceAll])); - J...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接