更具体地说,我需要能够做到以下几点:
>在基数为36的正N位数字上运算(例如数字为0-9 A-Z)
N是有限的,比如说9
>提供基本算术,至少以下3:
>加法(A B)
>减法(A-B)
>整体划分,例如地板(A / B).
>严格来说,我真的不需要base10转换能力 – 数字将100%的时间都在base36中.所以我很好,如果解决方案没有实现从base36转换回base10,反之亦然.
我不太关心解决方案是否是暴力“转换为基础10并返回”或转换为二进制,或者一些更优雅的方法“本地”执行baseN操作(如上所述,往返于base10转换不是需求).我唯一的三个注意事项是:
>符合上述最低规格
>这是“标准”.目前我们正在使用基于base10转换的老本土模块,这种模块是手动完成的,这种模块很糟糕,很糟糕.
我宁愿用一些常用的CPAN解决方案取而代之,而不是从头开始重新编写自己的自行车,但如果不存在更好的标准可能性,我完全有能力构建它.
>它必须是快速的(虽然不是闪电般快).需要1秒才能总结2个9位数的base36数字的东西比我自己可以滚动的任何东西都差:)
附:只是提供一些上下文,以防人们决定解决我的XY问题,除了回答上面的技术问题:)
我们有一个相当大的树(作为一堆边存储在DB中),我们需要在该树的子集上叠加顺序.树的尺寸在深度和宽度方面都很大.树非常积极地更新(插入和删除以及分支移动).
这是通过具有3列的第二个表来完成的:parent_vertex,child_vertex,local_order,其中local_order是由A-Z0-9构建的9个字符的字符串(例如,基数36的数字).
其他考虑因素
>要求每个孩子的本地订单是唯一的(并且每个父母显然是唯一的),
>父母的任何完整的重新排序都有点贵,因此实现是尝试为具有X子的父级分配 – 在0到36 ** 10-1之间有点均匀分布的顺序,这样几乎没有树插入导致完全重新排序.