在回答求将这段js代码转成php这个问题时,ChatGPT和我犯了同样的错误,我们都没发现JS代码中的这两串字符其实并不相同:
var strs = '0c4a20131ebd12f0de2b54163fe318b1e'
var r = "";
for (let i = 0;i < strs.length;) {
var ccc = '0c4a2013ebd12f0de2b54163fe318b1e'.charCodeAt(i++);
我一眼看上去,strs
和ccc
的开头不是一样的嘛,为什么下面不直接使用strs
呢?而ChatGPT也确实给出了符合我预期的结果,在ccc
处直接使用了$strs
。
$strs = '0c4a20131ebd12f0de2b54163fe318b1e';
$r = "";
for ($i = 0; $i < strlen($strs);) {
$ccc = ord($strs[$i++]);
最开始我一度以为ChatGPT给出的结果完全正确,因为结果是sYsC1g5GsgsKZ2wvsgw6sYdks65WOjFisiZkslFL1Bqk
,和JS版结果sYsC1g5GsgOk16TKs61GZYMb1BMCsg1lZ6MlsgUJs2M3
开头是相同的,我只看了开头就觉得结果正确,然后就发布了。
在发现结果并不正确之后,我也只是怀疑JS版是不是中途对strs
进行了改写,导致它不能在ccc
处引用,或者代码有计算精度问题导致中途出错。我完全没有怀疑strs
和ccc
处的字符串实际上不同,因为它们看上去惊人的一致,而且ChatGPT也认为两者相同,甚至直接做了改写,更何况输出结果的开头也是一致的……
在我反复多轮询问之下,ChatGPT对结果的差异也没有进一步的解释。
但其实,这两个字符串从中间的某一位开始就不同,这也是导致结果从中间开始出错的原因:
ChatGPT和我犯了一模一样的错误,这似乎意味着它的推理有着类似人类的”直觉“。
因为如果依赖机器的逐字节比较,它应该很容易就能发现两者不同,从而不会进行改写。
@老虎会游泳,估计逻辑上就不是逐字节比较吧。可能大体相同时,认为是同一个事物啥的(我也不懂)
要不,你拿同形字、零宽字啥的试试?