Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 红宝石和字母数字密码_Ruby_Url_Encoding - Fatal编程技术网

Ruby 红宝石和字母数字密码

Ruby 红宝石和字母数字密码,ruby,url,encoding,Ruby,Url,Encoding,我正在做一个涉及url“转发器”的项目(比如bit.ly或tinyurl.com,但我们并不需要它太短) 为此,我需要“生成”字母数字字符串(我明确希望字母数字)映射到每个url。其中一个选项是生成一个随机字符串并将其存储在某处。但是,我希望避免使用数据库,因为我们的应用程序中不使用任何数据库。我想对url进行“编码”,以便以后可以对其进行解码 有关于如何做的提示吗?无法完成。一个任意的URL包含许多字符——比如说100个字符。缩短的URL可能包含5个。如果没有某种查找表,您不能使用5个字符来重

我正在做一个涉及url“转发器”的项目(比如bit.ly或tinyurl.com,但我们并不需要它太短)

为此,我需要“生成”字母数字字符串(我明确希望字母数字)映射到每个url。其中一个选项是生成一个随机字符串并将其存储在某处。但是,我希望避免使用数据库,因为我们的应用程序中不使用任何数据库。我想对url进行“编码”,以便以后可以对其进行解码


有关于如何做的提示吗?

无法完成。一个任意的URL包含许多字符——比如说100个字符。缩短的URL可能包含5个。如果没有某种查找表,您不能使用5个字符来重建100;根本没有足够的信息来做这件事

编辑1:好吧,如果你实际上不需要URL缩短器(那么你为什么要写它?),有很多选择。我会选择纯Base64编码,可能在经过zlib或其他压缩器之后(这可能会使URL变长;您必须衡量它是否有用)

编辑2:标准Base64使用三个非字母数字字符:
+
/
-
。如果这些都是不可接受的,您有两个选择:

  • 修改Base64。“为URL修改Base64”,它删除所有
    =
    ,并分别用
    -
    替换
    +
    。但这些仍然不是字母数字,这对你没有帮助

  • 一些特别的方案,如Base32或Base36。如果您知道Base64是如何实现的,那么这非常容易实现(请参见上面的链接)。(编辑3:我猜Base32实际上是。看起来像RFC4648 Base32,带有
    8
    填充,而不是
    =
    填充,对您来说就可以了)

  • 一些半标准的方法。有很多可能性。不幸的是,它们中的大多数依赖于两个特殊的非字母数字字符,这仅仅是因为只需使用一个或两个以上的字符,就可以获得更高的性能。看一看,找一个比我能提供的更好的调查


  • 一个简单的方法是列出URL中允许的所有非字母数字的符号——我在快速互联网搜索中找到的符号是$-。+!*'();/?:@=& — 然后对它们进行编码。我的列表有17个符号,我能想到的在不牺牲易读性的情况下对它们进行编码的最简单方法是选择一个字母数字符号,比如s,作为移位码:

    另一种方法是将原始URL转换为位流,最好使用一些压缩算法,因为您已经丧失了易读性,然后为每个可能的6位序列分配一个字母数字符号。请注意,这留下了4个您从未使用过的字母数字符号-如果您真的关心长度,您可以重新使用它们,但这似乎不值得这么复杂


    我将忽略主题中的“加密”一词,因为您似乎对使方案难以发现并不感兴趣。

    我认为我实际上找到了一个更好的解决方案(至少在我的情况下更合适、更容易实现)

    这不知何故是一种破解,包括用H*参数解压字符串。 以下是代码示例:

    url =  "http://stackoverflow.com/questions/960658/crypto-in-ruby-and-alphanumeric"
    unpacked = url.unpack("H*")  # => 687474703a2f2f737461636b6f766572666c6f772e636f6d2f7175657374696f6e732f3936303635382f63727970746f2d696e2d727562792d616e642d616c7068616e756d65726963
    unpacked.pack("H*")  # => http://stackoverflow.com/questions/960658/crypto-in-ruby-and-alphanumeric
    

    我不会将此标记为答案(甚至不确定我是否可以…),但我想让读者知道,它实际上为我做了一些事情;)

    只要您不介意丑陋的url,您可以使用base64和url escape快速创建一个:

    require 'base64'
    require 'cgi'
    require 'uri'
    
    def encode_url(url)
      CGI.escape(Base64.encode64(url))
    end
    
    再来一次:

    def decode_url(encoded_url)
      Base64.decode64(CGI.unescape(encoded_url))
    end
    
    大而丑陋的URL,但它可以完成任务:

    >> u = encode_url("http://railsruby.blogspot.com/2006/07/url-escape-and-url-unescape.html")
    => "aHR0cDovL3JhaWxzcnVieS5ibG9nc3BvdC5jb20vMjAwNi8wNy91cmwtZXNj%0AYXBlLWFuZC11cmwtdW5lc2NhcGUuaHRtbA%3D%3D%0A"
    >> decode_url u
    => "http://railsruby.blogspot.com/2006/07/url-escape-and-url-unescape.html"
    

    大多数人可能都在寻找一种使用Ruby生成TinyURL样式字符串的方法。(我就是这样发现的。)

    好消息是它非常简单

    # timestamp
    >> DateTime.now.hash.abs.to_s(36)
    => "5ynfka" 
    
    # invite code
    >> "joe@momma.org".hash.to_s(36)
    => "emhs98"
    

    基于

    以及。。。我不在乎它是否短。。。重要的是,它需要“保存”原始url本身。我们主要是用它来跟踪点击次数。很抱歉从一开始就不清楚。。。我尝试使用Base64。。。问题是它添加了非字母数字字符,如%。有没有办法摆脱他们?谢谢你的帮助!令人惊叹的所有这些指针的Thx。。。我会让你知道我走哪条路!您也可以使用一些自定义字符集,比如说62个字符(0-9,a-z,a-z)或56个字符(与base 62相同,但没有类似的0,o,o和1,l,I)!我希望有一个亚军的问题回答得晚了很多,但完全有效!
    # timestamp
    >> DateTime.now.hash.abs.to_s(36)
    => "5ynfka" 
    
    # invite code
    >> "joe@momma.org".hash.to_s(36)
    => "emhs98"