需要一个数学算法将大整数中的数字编码为整数
我想将 100 位数字转换为小于 10 位数字,反之亦然。 因此,我将该编码号码传递给移动用户,返回后可以再次生成 100 位数字。 我想在 PHP、.NET 或 JS 中使用它。
但在此之前我需要一个算法。
我有一些想法使用简单的除减法和加乘选项来实现。但需要一些比这更安全的东西。
I want to convert a number value of 100 digits into lessthan 10 digits and vice versa.
So I pass that encoded number to mobile user and on getting back can make 100 digits number again.
I want to use it in PHP, .NET or JS.
But before that I need an algorithm for that.
I have some idea to use simple divide-subtract and add-multiply options in my mind to implement. But need some more secure than that.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你所要求的是不可能的。您正尝试将 10^100 个物品放入 10^10 个盒子中。有些盒子会容纳不止一件物品,因此不可能反转回“原始”物品。
您可以将 100 位以 10 为基数的数字编码为 56 位以 62 为基数的数字(使用大写和小写罗马字母以及数字 0-9)。这里的数学公式是
100 * log(10) / log(62)
。要使用某些字母表中少于 10 个字符进行编码,您需要一个包含 ~2^34 个符号的字母表。这里的数学是
100 * log(10) / log(符号数量)
。祝你好运。What you're asking for is impossible. You are trying to pigeonhole 10^100 items into 10^10 boxes. Some box will get more than one item and so it's impossible to invert back to "the" original item.
You could encode the 100-digit base-10 numbers as a 56-digit base-62 number (use uppercase and lowercase Roman alphabet and digits 0-9). The math here is
100 * log(10) / log(62)
.To encode using less than ten characters from some alphabet, you need an alphabet with ~2^34 symbols. The math here is
100 * log(10) / log(number of symbols)
. Good luck with that.如果 100 位数字中有超过 10 000 000 000 个不同的可能值,您不可能将其映射到 10 位数字并可靠地映射回原始数字。
If you have more than 10 000 000 000 different possible values in the 100 digit number you can not possibly map that to a 10 digit number and reliably map back to the original number.
一个 100 位数字,我假设这是一个以 10 为基数的数字,当在计算机上谈论数字时,谈论“数字”几乎毫无意义。
如果您实际上指的是 100 位整数,那么这不会轻易适合单个 64 位整数(范围 +/- 9,223,372,036,854,775,808 ),那么您还没有很好地表达您的问题。无论进行多少压缩或编码,您都无法使用不超过 10 位来表示 100 位。
如果您的意思是以 10 为基数的 100 个数字,那么您正在处理 bignum,因此可能应该将它们视为字节并使用 bignum 库。
100 个十进制数字仍然小于 512 位。
A 100 digit number, I assume this is a base ten number, When talking about numbers on computers talk of 'digits' is almost meaningless.
If you actually mean a 100bit integer, then this wont easily fit into a single 64bit integer ( range +/- 9,223,372,036,854,775,808 ) then you have not phrased your question all that well. And no amount of compression or encoding will let you represent 100bits using no more than 10bits.
If you mean 100 figures in base ten, then you are dealing with bignums so should probably just treat them as bytes and use a bignum library.
100 base ten figures is still less than 512 bits.
假设 100 位数字以 10 为基数,那么如果我的数学没有错的话,您将需要 10 个以 100 为基数的数字来表示同一个数字。因此,您需要扩展字符以包含其他字形,包括大写和小写字母等,而不是仅使用 0-9 的字符,以完成 100 个字符的字母表。好的,我的数学是错误的,所以忽略这一点,但考虑下一段。另一个想法是使用哈希算法从 100 位数字中导出 10 字节哈希,并将其用作服务器端数据库(哈希表)中的密钥。无需编码/解码,只需将密钥发送给移动客户端,移动客户端使用密钥从服务器获取100位号码。
Assuming that the 100-digit number is base 10, then if my math is not wrong you'll need 10 base 100 digits to represent the same number. So instead of using just characters from 0-9, you'll need to expand the characters to include other glyphs, including upper-case and lower-case letters, etc., to complete a 100 character alphabet.OK, my math is wrong, so disregard this, but consider the next paragraph.Another thought is to use a hashing algorithm to derive a 10-byte hash from your 100-digit number and use that as key in a server-side database (hash-table). No encoding/decoding, just send the key to the mobile client, the mobile client uses the key to fetch the 100-digit number from the server.