【问题标题】:How should I encode two integers into lowercase alphanumeric characters?我应该如何将两个整数编码为小写字母数字字符?
【发布时间】:2017-01-01 07:32:02
【问题描述】:

我有两个从 0 到无穷大的整数(实际上可能小于 100 万,但不想有任何限制)。我想将这两个整数编码为小写字母数字字符串(可能包含破折号,但不应该只是数字)。此外,我希望字符串有点随机(例如,不想总是在每个 int 前面加上“a”)。最重要的要求是我需要能够轻松解码这个字母数字字符串。

我通常只会使用 md5 散列,但它不适用于这种情况,因为我无法从 md5 返回到原始整数。我也考虑过 Base64,但它不起作用,因为字符串可能包含大写。

是否有满足这些要求的已知散列算法?

【问题讨论】:

  • Base-32 怎么样?
  • 如果可逆就不是哈希算法,只是编码算法,学究气。
  • 当你说“有点随机”时,你是什么意思?随机是不可预测的,还是随机的,对于顺序值来说是高度分布的?
  • 您可能想查看stackoverflow.com/questions/8554286/obfuscating-an-id 以了解混淆您的值的想法,然后在混淆后,您可以使用 Base-32 之类的简单代码对其进行编码。
  • Base-32 看起来像我需要的。谢谢。

标签: math hash encoding character-encoding


【解决方案1】:

如果您只是想更改整数的基数

您可以使用 base 16(又名十六进制)代替 base64:

>>> hex(1234)[2:]
'4d2'
>>> int('4d2', 16)
1234

或base32:

>>> b32_encode(1234)
b'atja===='
>>> b32_decode(b'atja====')
1234

如果您希望隐藏整数

最简单的方法是将整数乘以某个数字,然后用更大的随机键进行异或:

>>> key = 0xFa907fA06 # The result of punching my keyboard.
>>> number = 15485863
>>> obscured = (1234 * number) ^ key
50902290680
>>> hex(obscured)
'bda0350f8'
>>> (50902290680 ^ key) / number
1234

想要比这更强大的混淆需要更多的研究,在这种情况下,this 类似的问题可能是一个很好的起点。

【讨论】:

猜你喜欢
  • 2019-04-24
  • 2020-02-20
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多