在我们的数据库中,每个Person
都有一个ID,即生成数据库的自动递增整数。现在,我们想要生成一个更加用户友好的字母数字ID,可以公开曝光。像护照号码一样的东西。我们显然不希望将DB ID公开给用户。出于这个问题的目的,我将调用我们需要生成的内容UID
。
注意:UID并不是要替换数据库ID。您可以将UID视为数据库ID的更漂亮的版本,我们可以将其提供给用户。
我认为解决这个问题的方法是:
第1步:哈希。
我已经阅读了以下哈希函数:
哈希返回一个长字符串。我读了here关于XOR折叠的东西,把字符串缩短了。但我找不到太多关于此的信息。
第2步:编码。
我读到了以下编码方法:
我猜测编码的输出将是我正在寻找的UID字符串。
第3步:解决碰撞问题。
我希望得到一些关于我是否正确行以及如何实际实现这一目标的专家建议。
我将在 Ruby On Rails 应用程序中实现此功能。因此,请在您的建议中考虑到这一点。
感谢。
评论和回答让我重新思考并质疑我的一个要求:我们需要在分配一次后为用户重新生成UID。我想我只是想保证安全,在我们丢失用户的UID的情况下,如果它是用户现有属性的函数,我们将能够恢复它。但我想我们可以通过使用备份解决这个问题。
因此,如果我删除了该要求,则UID基本上变成一个完全随机的10个字符的字母数字字符串。我正在添加一个包含我提议的实施计划的答案。如果其他人有更好的计划,我会将其标记为答案。
答案 0 :(得分:2)
正如我在问题更新中所提到的,我认为我们要做的是:
答案 1 :(得分:0)
db_id.chr
能为你效力吗?它将采用整数并从中生成一个字符串。然后,您可以附加他们的首字母或姓氏或其他任何内容。例如:
user = {:id => 123456, :f_name => "Scott", :l_name => "Shea"}
(user.id.to_s.split(//).map {|x| (x.to_i + 64).chr}).join.downcase + user.l_name.downcase
#result = "abcdefshea"