ruby-on-rails-3 – ROR – 为数据库ID生成字母数字字符串
在我们的DB中,每个Person都有一个ID,即生成数据库的自动递增整数.现在,我们想要生成一个更加用户友好的字母数字ID,可以公开曝光.像护照号码一样的东西.我们显然不希望将DB ID公开给用户.出于这个问题的目的,我将调用我们需要生成的内容,即UID.
注意:UID不是要替换数据库ID.您可以将UID视为数据库ID的更漂亮的版本,我们可以将其提供给用户. >我想知道这个UID是否可以是数据库ID的功能.也就是说,我们应该能够为给定的DB ID重新生成相同的UID. 我认为解决这个问题的方法是: 第1步:哈希. 我已经阅读了以下哈希函数: > SHA-1 哈希返回一个长字符串.我阅读了here关于XOR折叠的东西,将字符串缩短到更短的长度.但我找不到太多关于此的信息. 第2步:编码. 我读到了以下编码方法: > Crockford Base 32编码 我猜测编码的输出将是我正在寻找的UID字符串. 第3步:解决碰撞问题. >为了解决冲突问题,我想知道是否可以在生成UID时生成随机密钥并在函数中使用此随机密钥. 我希望得到一些专家建议,我是否正在沿着正确的路线前进,以及我如何实际实现这一点. 我将在Ruby On Rails应用程序中实现它.所以,请在您的建议中考虑到这一点. 谢谢. 更新 评论和回答使我重新思考并质疑我的一个要求:我们需要在分配一次后为用户重新生成UID.我想我只是想保证安全,在我们丢失用户的UID的情况下,如果它是用户现有属性的函数,我们将能够恢复它.但我想我们可以通过使用备份解决这个问题. 因此,如果我删除该要求,则UID基本上变成一个完全随机的10个字符的字母数字字符串.我正在添加一个包含我提议的实施计划的答案.如果其他人有更好的计划,我会将其标记为答案. 解决方法
正如我在问题更新中所提到的,我认为我们要做的是:
>预先生成足够大量的随机且唯一的十个字符的字母数字字符串.没有散??列或编码.>以随机顺序将它们存储在表格中.>创建用户时,选择第一个这些字符串并将其分配给用户.>将ID分配给用户后,从ID池中删除此ID.>当池减少到较低的数量时,显然需要使用新的字符串补充池,并进行唯一性检查.这可以在由观察者发起的延迟工作中完成.>预生成的原因是我们正在将所有昂贵的唯一性检查卸载到一次性预生成操作.>从此池中为新用户选择ID时,保证唯一性.因此,创建用户(非常频繁)的操作变得很快. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |