- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有来自数据库的 ID,我希望它们简短且易于肉眼区分(即,两个相近的数字看起来不同)。
像这样:
13892359163211 -> ALO2WE7
13992351216421 -> 52NBEK3
或类似的算法。有点像哈希,除了它需要是可逆的?像 AES 这样的加密算法几乎是理想的,只是它的输出太长了。 (而且矫枉过正)。
我正在使用 Python (3),尽管我认为这并不重要
最佳答案
新答案,“接近”数字看起来不同
您可以使用 RSA 来加密(然后解密)您的号码。这绝对是矫枉过正 - 但是......这是一个例子:安装 https://github.com/sybrenstuvel/python-rsa
(pip install rsa
)
import rsa
import rsa.core
# (pubkey, privkey) = rsa.newkeys(64) # Generate key pair
pubkey = rsa.PublicKey(n=9645943279888986023, e=65537)
privkey = rsa.PrivateKey(n=9645943279888986023, e=65537, d=7507666207464026273, p=9255782423, q=1042153201)
print("1st", rsa.core.encrypt_int(13892359163211, pubkey.e, pubkey.n))
print("2nd", rsa.core.encrypt_int(13992351216421, pubkey.e, pubkey.n))
print("1st", hex(rsa.core.encrypt_int(13892359163211, pubkey.e, pubkey.n))[2:])
print("2nd", hex(rsa.core.encrypt_int(13992351216421, pubkey.e, pubkey.n))[2:])
# If you want to compare a couple of numbers that are similar
for i in range (13892359163211, 13892359163251):
encrypted = rsa.core.encrypt_int(i, pubkey.e, pubkey.n)
# decrypted = rsa.core.decrypt_int(encrypted, privkey.d, privkey.n)
print (i, hex(encrypted)[2:], encrypted)
请注意,您不能加密大于 pubkey.n
的数字。这是与 RSA 相关的限制。通过生成具有更高 n
的不同 key 对,您可以避免此问题。如果您希望所有生成的数字具有相同的长度,请在它们前面加上前导零。您还可以考虑将它们设为大写以提高可读性。要使显示的字符串更短,请考虑使用我在下面的旧答案中提到的 base62 编码。
输出
1st 5427392181794576250
2nd 7543432434424555966
1st 4b51f86f0c99177a
2nd 68afa7d5110929be
input hex(encrypted) encrypted
13892359163211 4b51f86f0c99177a 5427392181794576250
13892359163212 2039f9a3f5cf5d46 2322161565485194566
13892359163213 173997b57918a6c3 1673535542221383363
13892359163214 36644663653bbb4 244958435527080884
13892359163215 c2eeec0c054e633 877901489011746355
...
旧答案 与显示数字有点短有关,没有意识到它们看起来应该有很大不同
您想将数字的底数从 10 更改为更大的数字以使用更少的字符。有关 base 62 (a-zA-Z0-9
) 的示例,请参见 https://stackoverflow.com/a/1119769。
或者以 16 为基数,(0-9A-F
,十六进制)又快又脏。
hex(13892359163211)[2:] # -> 'ca291220d4b'
关于python - 将数字 ID 转换为简短的不同字母数字代码的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57624017/
void main(){ char c; unsigned char uc; unsigned short us1, us2; short s1, s2; c
我要删除 wordpress html 格式在 woocommerce 产品简短描述中。添加 电话 到处标记。我知道如何在 wp 帖子和页面中做到这一点 remove_filter( 'the_exc
我通常会打开一个命令的联机帮助页,该命令已经知道我正在搜索的选项并阅读其描述。有时只需搜索该选项即可立即生效,有时该选项在其他地方被引用,有时该选项仅作为子字符串出现在前面的文本中。 作为一个具体的例
假设我们有一个编号的圆圈。我们想从 A 点到 B 点,但不知道应该向左还是向右。你会如何使用数字来计算你应该朝哪个方向前进? 示例: 我们目前在 1。我们想继续 5。我可以直观地看到 5 更近,所以我
我正在使用以下内容将产品名称和价格添加到悬停框。 在 functions.php 中 // Alter produt loop individual products add_action( 'woo
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个for循环 for ($x=1; $x<=5; $x++){ ($x == 3)? continue : true; //some code here } 现在执行时出现错误
我刚刚开始我的第一个 Java Swing 项目(之前主要做基于 Web 的应用程序),并尝试了解如何构建一个适当的架构,并在 MVC 组件之间分离关注点。 我发现的几乎所有文档都非常深入地介绍了每个
我是一名优秀的程序员,十分优秀!