gpt4 book ai didi

javascript - 有没有一种简单的方法可以将唯一的字符串转换为 JavaScript 中的唯一数字?

转载 作者:可可西里 更新时间:2023-11-01 01:46:33 26 4
gpt4 key购买 nike

这几乎是 a cross post from Math SE - 虽然我的问题的解释是相同的,但在 Math.SE 上,我正在寻求我的问题的数学解决方案。

我的问题是,我在 Math.SE 上得到的解决方案是“转换为基数 35”,这可能是一个很好的答案,但我的数学真的很糟糕,不明白如何在我的代码中应用该解决方案.我试着查找 a lesson on converting to different bases ,这让我很困惑。即使查看 a question about converting numbers to bases in JavaScript 也不清楚我将如何使用它来完成我需要做的事情。

有没有一种简单的方法可以在 JavaScript 中处理这个问题?下面是完整的问题:

我有一个不寻常的编程问题,它的数学方面让我感到难过。

我生成了一个由七个字符组成的唯一字符串,每个字符都是从这些可能性中随机选择的:ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789 例如 A6HJ92B,我需要将其转换为一个唯一的数值。转换时,此随机字符串的任何两个版本都不能是姓名编号。

我可以只生成一个数字而不是在原始 id 中包含字母,但这当然意味着我必须增加字符串的长度,而且我的应用程序的用户可能想要输入这个字符串,因为它标识了他在应用程序中的“ session ”,所以我想保持简短。

所以我的想法是构建一个这样的表:

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 ) 相乘,我认为那里也可能存在冲突。

有没有办法以消除碰撞的方式进行计算?如果不能消除碰撞,我可以使用什么方法来最小化它们?

最佳答案

基本上,您需要一个 injective转换 f : S → N,其中 S 是长度为 7 且字符为 A-Z1-9 的 JS 字符串集合,并且 N 是所有 JS 数的集合。

一种可能的方法是考虑 S 中的字符串是 positional数字编码,正如您尝试的那样。

但是,为了单射(避免碰撞),您应该将每个字符的值乘以基数的位置次方。

例如,给定下表的字符值

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.

您可以使用 parseInttoString 轻松进行转换:

parseInt('A6HJ92B', 36); // 22160072099
(22160072099).toString(36).toUpperCase(); // "A6HJ92B"

如果您想使用任意值表,则必须手动编写转换代码。

请注意,在 JS 中,数字是 64 位的 double float 。这意味着精度有限,您不能存储任意大的整数。超过此最大值将无法正常工作

Number.MAX_SAFE_INTEGER; // 9007199254740991
Number.MAX_SAFE_INTEGER.toString(36).toUpperCase(); // "2GOSA7PA2GV"

但由于您的字符串只有 7 个字符,所以应该足够了。

关于javascript - 有没有一种简单的方法可以将唯一的字符串转换为 JavaScript 中的唯一数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35821224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com