【问题标题】:Encode id to numbers and letters?将id编码为数字和字母?
【发布时间】:2013-01-04 20:47:50
【问题描述】:

我想将 id 编码为包含数字和大写字母的唯一字符串,如下所示:

40 => A5TY8

但是

41 => Y7HEG

41 的输出与40A5TY9 完全不同。

如何做到这一点?

【问题讨论】:

  • 您预计有多少个身份证号码?只列出一次是否可行,还是需要能够即时生成?
  • 我想动态生成它。我想要 2 个函数编码和解码,所以它不能是 md5 或 sha。它可能是数十亿个 id,因此生成一次并使用它 - 这不是解决方案。
  • 它们必须是唯一的和简短的吗?如果是这样,您需要某种查找表。
  • 不一定短。独特,可解码
  • @Pafjo 我做到了。我有:TA => 494 T0 => 495 TD => 496 TW => 497 T3 => 498 T9 => 499

标签: ruby


【解决方案1】:

我想告诉你所有关于摘要的事情。但看到你的评论我想你想要这样的东西

https://github.com/namick/obfuscate_id

或者更好更通用的

https://github.com/patdeegan/integer-obfuscator

您也可以使用可恢复的 Base64 对其进行编码

http://ruby-doc.org/stdlib-1.9.3/libdoc/base64/rdoc/Base64.html

请注意,您可能想要使用 urlsafe_encode64,这样您就不会在其中包含 /n 和其他内容

所以你可以做类似的事情

require "base64"

original = 41

converted = Base64.urlsafe_encode64("41")
converted_for_display = converted.tr('^A-Za-z0-9', '')
# => "NDE"

reversed = Base64.urlsafe_decode64(converted)

您还可以对数字进行加密,使其具有唯一性和可逆性,但速度较慢且更麻烦,但您可以选择任何您想要的密钥

【讨论】:

  • 谢谢您,但是带有碱基的解决方案编号是相似的,NDE,NDA。最有趣的是使用整数混淆器,然后使用基数。
  • ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".split("").shuffle.join def bijective_encode(i) return ALPHABET[0] if i == 0 s = '' base = ALPHABET.length while i > 0 s > 18) - $salt end def encode(id) bijective_encode((id+$salt)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
相关资源
最近更新 更多