【问题标题】:Need an maths algorithm to encode number in big integer to integer需要一个数学算法将大整数中的数字编码为整数
【发布时间】:2011-11-19 07:17:04
【问题描述】:

我想将 100 位的数值转换为小于 10 位的数字,反之亦然。 因此,我将该编码号码传递给移动用户,然后返回可以再次制作 100 位数字。 我想在 PHP、.NET 或 JS 中使用它。

但在此之前我需要一个算法。

我有一些想法在我的脑海中使用简单的除减和加乘选项来实现。但需要一些比这更安全的。

【问题讨论】:

  • 安全吗?那么你的意思是实际上加密,而不是编码?当然这是不可能的,因为每个 10 位数字都有很多 100 位数字。对大整数有什么严格的限制吗?我们可以使用多个 10 位整数吗?
  • 你能传10位数字还是10字节?
  • 有 10100 个可能的 100 位数字,只有 109 个小于 10 位的数字,所以如果你想压缩 any 100位数字,原则上是不可能的。你想做什么?
  • 对我来说这听起来不像数学
  • 你能解释一下简单的除减和加乘选项吗?我认为在不丢失数据的情况下将 100 位压缩到 10 位是不太可能的...

标签: algorithm math integer encode


【解决方案1】:

你要求的是不可能的。您正在尝试将 10^100 个项目归类到 10^10 个盒子中。有些盒子会得到不止一件物品,因此不可能恢复到“原始”物品。

您可以将 100 位 base-10 数字编码为 56 位 base-62 数字(使用大写和小写罗马字母和数字 0-9)。这里的数学是100 * log(10) / log(62)

要使用某些字母表中少于十个字符进行编码,您需要一个包含 ~2^34 个符号的字母表。这里的数学是100 * log(10) / log(number of symbols)。祝你好运。

【讨论】:

  • 很明显,要将 10 个十进制数字编码为 1 (=100->10),您的字母表中需要 10,000,000,000 个符号。
  • 我只能使用 0-9 位(整数)以外的任何数字。我要加密这个号码。通过服务器将其传递给移动应用程序,因此我需要对其进行加密。在响应方面,我也需要在解密模式下使用它。
  • @Shail Patel:受限于只能使用数字0--9,您的问题无法解决。
【解决方案2】:

如果您在 100 位数字中有超过 10 000 000 000 个不同的可能值,则您不可能将其映射到 10 位数字并可靠地映射回原始数字。

【讨论】:

    【解决方案3】:

    一个 100 位的数字,我假设这是一个以十为底的数字,在计算机上谈论数字时,谈论“数字”几乎没有意义。

    如果您实际上是指 100 位整数,那么这不会很容易地适合单个 64 位整数(范围 +/- 9,223,372,036,854,775,808 ),那么您还没有很好地表达您的问题。再多的压缩或编码都不会让您使用不超过 10 位来表示 100 位。

    如果您的意思是 100 个以 10 为基数的数字,那么您正在处理 bignum,因此可能应该将它们视为字节并使用 bignum 库。

    100 个以十为底的数字仍然小于 512 位。

    【讨论】:

    • @tom,我不是很慌乱的中间句子:)
    【解决方案4】:

    假设 100 位数字是以 10 为底,那么如果我的数学没有错,您将需要 10 个以 100 为底的数字来表示相同的数字。因此,您需要扩展字符以包含其他字形,包括大写和小写字母等,而不是仅使用 0-9 的字符,以完成 100 个字符的字母表。 OK,我的数学是错误的,所以忽略这一点,但考虑下一段。

    另一个想法是使用散列算法从您的 100 位数字中派生 10 字节散列,并将其用作服务器端数据库(散列表)中的键。无需编码/解码,只需将密钥发送给移动客户端,移动客户端使用密钥从服务器获取 100 位数字。

    【讨论】:

    • 10 个以 100 为基数的数字仅表示 20 个以 10 为基数的数字。您需要 10 个以 10^10 为基数的数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多