这几乎是Math SE的一个交叉文章-尽管我的问题的解释是相同的,但在Math.SE上,我一直在寻求数学解决方案。
我的问题是,我在Math.SE上获得的解决方案是“转换为基数35”,这可能是一个很好的答案,但是我对数学确实感到非常恐惧,并且不了解如何在我的代码中应用该解决方案。我尝试查找有关转换为不同基准的课程,这对我来说很混乱。即使是关于将数字转换为JavaScript中的基数的问题,也没有弄清楚我将如何精确地将其用于需要执行的操作。
有没有一种简单的方法可以在JavaScript中处理此问题?这是完整的问题:
我有一个不寻常的编程问题,而数学方面的问题让我感到困惑。
我生成了一个由七个字符组成的唯一字符串,每个字符串都是从这些可能性中随机选择的:ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789
例如A6HJ92B
,我需要将其转换为唯一的数字值。转换后,此随机字符串的任何两个版本都不能是名称编号。
我只能生成一个数字,而不是在原始id中包含字母,但是,这当然意味着我必须增加字符串的长度,并且我的应用程序的用户可能希望键入此字符串,因为它可以识别他的字符串。应用程序中的“会话”,因此我想使其简短。
所以我的想法是建立一个这样的表:
A : 1,
B : 2,
C : 3,
D : 4,
E : 5,
F : 6,
G : 7,
H : 8,
... you get the idea ...
5 : 31,
6 : 32,
7 : 33,
8 : 34,
9 : 35
然后我将所有数字加起来...
A6HJ92B
:
A : 1
6 : 32
H : 8
J : 10
9 : 35
2 : 28
B : 2
1+32+8+10+35+28+2 = 116
...但是我意识到这是一个错误的想法,因为许多可能的字符串会“碰撞”或等于相同的数字。我需要每个唯一的字符串等于一个唯一的数字。
因此,即使我乘以每个字符的值(1*32*8*10*35*28*2 = 5,017,600
),我也在想那里也可能发生冲突。
有没有一种方法可以消除碰撞?如果无法消除冲突,我可以使用哪些方法将其最小化?
基本上,您需要进行一次内射转换f : S → N
,其中S
是长度为7的带有字符的JS字符串的集合A-Z1-9
,并且N
是所有JS数字的集合。
一种可能的方法是,像您尝试的那样,考虑其中的字符串S
是数字的位置编码。
但是,为了具有内射性(避免冲突),应将每个字符的值乘以基础乘以位置的幂。
例如,给定下表的字符值
0 ⟶ 0
1 ⟶ 1
⋮ ⋮
9 ⟶ 9
A ⟶ 10
B ⟶ 11
⋮ ⋮
Z ⟶ 35
A6HJ92B
将成为10×36⁶ + 6×36⁵ + 17×36⁴ + 19×36³ + 9×36² + 2×36 + 11
,也就是22160072099
。
您可以使用parseInt
和轻松进行转换toString
:
parseInt('A6HJ92B', 36); // 22160072099
(22160072099).toString(36).toUpperCase(); // "A6HJ92B"
如果要使用任意值表,则必须手动编码转换。
请注意,在JS中,数字是64位的双精度浮点数。这意味着精度是有限的,并且您不能存储任意大的整数。超出此最大值,它将无法正常工作
Number.MAX_SAFE_INTEGER; // 9007199254740991
Number.MAX_SAFE_INTEGER.toString(36).toUpperCase(); // "2GOSA7PA2GV"
但是由于您的字符串只有7个字符,因此就足够了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句