优化生成 IBAN 的 PHP 脚本

Posted

技术标签:

【中文标题】优化生成 IBAN 的 PHP 脚本【英文标题】:Optimize PHP script for generating IBAN 【发布时间】:2014-02-05 10:21:17 【问题描述】:

我用 php 编写了为给定银行帐户生成克罗地亚语 IBAN 的函数。我可以轻松地重写以返回任何 IBAN。问题是我认为它既不优化也不优雅。这是函数:

function IBAN_generator($acc)

    if(strlen($acc)!=23)
        return;
    $temp_str=substr($acc,0,3);
    $remainder =$temp_str % 97;
    for($i=3;$i<=22;$i++)
    
        $remainder =$remainder .substr($acc,$i,1);
        $remainder  = $remainder  % 97;
    
    $con_num = 98 - $remainder;
    if ($con_num<10)
    
        $con_num="0".$con_num;
    
    $IBAN="HR".$con_num.substr($acc,0,17);
    return $IBAN;
 

有没有更好的方法来生成 IBAN?

【问题讨论】:

您面临的具体问题是什么?需要生成大量代码吗? 【参考方案1】:

乍一看似乎你不能让它更快,它只是简单的字符串附加序列。 除非你必须使用它数千次并且这对你的应用程序来说是一个瓶颈,否则我不会浪费时间让它变得更好,它可能需要几微秒,并且仅仅升级 PHP 版本可能会比代码更改更好地改进你会实施的。

如果您真的必须加快速度,可能的解决方案是 - 将函数写入扩展 - APC 操作代码缓存(在解释代码时它应该使事情通常更快,因此全局提高速度) - 在内存中缓存结果(仅当您的应用程序多次运行相同的输入时,对于像这样的简单算法来说,这可能不是常见的情况)

如果你想玩它并尝试让它更快、更小心,你可以改变逻辑并引入一个错误。始终使用单元测试,或者在更改之前编写一些测试用例,这始终是一个好习惯

【讨论】:

【参考方案2】:

你可以看看这个 repo:

https://github.com/jschaedl/Iban

您的职责是为克罗地亚添加规则。 之后,您应该可以在您的国家/地区使用它。

问候

【讨论】:

【参考方案3】:

为了进行微优化,substr 的时间复杂度为 O(n),因此您的循环的时间复杂度为 O(n2)。为避免这种情况,请使用str_split 并按索引访问生成数组的字符。

然后,为了更优雅,可以将 for 循环替换为array_reduce。

另外,通常避免在循环中连接字符串,它具有 O(n2) 时间和内存复杂度。 IBAN 很短,PHP 不在微型计算机上运行,​​所以这里不是问题。但是,如果您曾经使用过更长的字符串,请生成一个数组,然后 implode it*。

当然,如果你在= 周围和for/if 之后的间距保持一致,它也会更优雅;-)


* 在 javascript 中,我曾经尝试通过迭代字符串连接来生成韩文字母的 html 表。它使浏览器崩溃,消耗 1GB+ 内存。

【讨论】:

以上是关于优化生成 IBAN 的 PHP 脚本的主要内容,如果未能解决你的问题,请参考以下文章

25-pytest-参数化生成用例标题

40-pytest-Hook函数之参数化生成用例

windows&lunix下node.js实现模板化生成word文件

实战项目一:半自动化生成财务分析报告

深入理解PHP opcode优化

验证 IBAN PHP