【问题标题】:SecureRandom string with tr translate showing abundance of underscores?SecureRandom 字符串与 tr 翻译显示丰富的下划线?
【发布时间】:2014-05-04 06:46:01
【问题描述】:

我正在使用 Devise 并尝试使用 Devise.friendly_token 生成密码,结果发现它产生了不需要的特殊字符。我发现 Devise.friendly_token 居然用了这个方法:

SecureRandom.urlsafe_base64(15).tr('lIO0', 'sxyz')

尝试删除“-”、“=”和“_”的特殊字符,我将 Devise.friendly_token 调用替换为:

SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU')

但是,我发现“U”字符过多,替换了下划线(显然其中一些实际上是“U”)。所以,我尝试了这个调用,它消除了“_”到“U”的翻译。

SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM')

这显示了更合理的结果分布,但仍然留下了下划线特殊字符。

谁能告诉我为什么会发生这种情况以及如何解决它?示例输出为:

irb(main):017:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "mvgjptsy"
irb(main):018:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "UUh1fUU-"
irb(main):019:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "UgU4U981"
irb(main):020:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "UUUU1q27"
irb(main):021:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "ajU7zjUn"
irb(main):022:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "UxgUwt7U"
irb(main):023:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "UUpUcUvU"
irb(main):024:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "U4UbU2ho"
irb(main):025:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "icsU7bcs"
irb(main):026:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-_', 'sxyzEMU').first(8)
=> "5vfdfUoU"
irb(main):027:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "1Q71wib4"
irb(main):028:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "TzkKT9s6"
irb(main):029:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "iWGBgys_"
irb(main):030:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "hkxNPGKg"
irb(main):031:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "sHMDeAsc"
irb(main):032:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "Tov7bYaB"
irb(main):033:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "4vMLFdSJ"
irb(main):034:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "zxstSvs8"
irb(main):035:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "rMEdizyG"
irb(main):036:0> SecureRandom.urlsafe_base64(15).tr('lIO0=-', 'sxyzEM').first(8)
=> "gXK33_ux"

【问题讨论】:

    标签: ruby-on-rails random devise passwords


    【解决方案1】:

    String#tr 使用- 字符来表示一系列字符。如果您的意思是-,则需要使用反斜杠对其进行转义。该示例将= 更改为E,将> 更改为M,并将从?_ 的所有字符(包括所有大写字母)更改为U,因此有很多U。

    要获得您期望的结果,请使用:

    SecureRandom.urlsafe_base64(15).tr('lIO0=\-_', 'sxyzEMU')
    

    【讨论】:

    • 这似乎合乎逻辑,但你能用明确的术语解释结果吗?
    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2011-07-27
    • 2013-08-22
    • 2021-09-26
    • 2011-06-16
    相关资源
    最近更新 更多