2009-06-06 6 views
0

Je travaille sur un projet qui implique un url "forwarder" (comme bit.ly ou tinyurl.com, mais nous n'avons pas vraiment besoin qu'il soit court). Pour cela, j'ai besoin de "générer" des chaînes alphanumériques (je veux explicitement alphanumérique) pour mapper à chaque URL. Une des options serait de générer une chaîne aléatoire et de la stocker quelque part. Cependant, je voudrais éviter d'utiliser une base de données puisque nous n'en utilisons aucun dans notre application. Je veux réellement "encoder" l'URL afin qu'elle puisse être décodée plus tard.Crypto en Ruby et Alphanumeric

Des conseils sur la façon de faire cela?

Répondre

2

Impossible à faire. Une URL arbitraire contient beaucoup de caractères - disons 100. Une URL raccourcie contient peut-être 5. Vous ne pouvez pas utiliser 5 caractères pour reconstruire 100 sans une table de recherche quelconque; il n'y a tout simplement pas assez d'informations disponibles pour le faire.

EDIT 1: Eh bien, si vous ne avez pas réellement besoin d'une URL raccourcisseur (? Alors pourquoi avez-vous écrit que), il y a beaucoup d'options. J'opterais pour un codage Base64 simple, peut-être après un passage dans zlib ou un autre compresseur (cela pourrait rendre les URL plus longues, vous devrez mesurer si ça aide ou non).

EDIT 2: standard base64 n'utilise trois caractères non alphanumériques: +, / et -. Si ceux-ci sont inacceptables, vous avez quelques options:

  1. Base64 modifiée. Wikipedia suggests "Base64 modifié pour l'URL", qui supprime tous = et remplace + et / avec - et _ respectivement. Mais ceux-ci ne sont pas encore alphanumériques, ce qui ne vous aide pas.

  2. Un schéma ad-hoc, comme Base32 ou Base36. Ceci est vraiment facile à implémenter si vous savez comment fonctionne Base64 (voir lien ci-dessus). (Edit 3: Je suppose que Base32 est en fait standardized. On dirait RFC 4648 Base32 avec 8 rembourrage au lieu de = rembourrage fonctionnerait très bien pour vous).

  3. Une approche semi-standard. Il y a beaucoup de possibilités. Malheureusement, la plupart d'entre eux reposent sur quelques caractères spéciaux non alphanumériques, simplement parce qu'en utilisant seulement un ou deux caractères de plus, vous pouvez obtenir des performances supérieures. Jetez un oeil à Binary-to-text encoding pour une meilleure enquête que je peux donner.

+0

Eh bien ... Je ne se soucient pas vraiment si elle est courte ou non ... l'important est qu'il doit « tenir » l'Thr url orginal en elle-même. Nous l'utilisons principalement pour suivre un certain nombre de clics. –

+0

Désolé de ne pas être clair dès le début ... J'ai essayé d'utiliser Base64 ... le problème est qu'il ajoute des caractères non-alphanum, comme%. est-il possible de s'en débarrasser? Merci pour votre aide! –

+0

Génial! Thx pour tous ces pointeurs ... Je vous dirai quel chemin je prends! –

0

Une façon simple de le faire serait de lister tous les symboles autorisés dans une URL qui ne sont pas alphanumériques -.! Ceux que je suis venu avec une recherche rapide sur Internet sont -_ $ + * »(); /?: @ = & - et juste les encoder en quelque sorte. Ma liste a 17 symboles, et la façon la plus simple de les encoder sans renoncer à la lisibilité que je peux penser serait de choisir un symbole alphanumérique, disons s, d'agir comme un code de changement:

$ ⇒ s0 - ⇒ s1 _ ⇒ s2 . ⇒ s3 + ⇒ s4 ! ⇒ s5 
* ⇒ s6 ' ⇒ s7 (⇒ s8 ) ⇒ s9 ; ⇒ sa /⇒ sb 
? ⇒ sc : ⇒ sd @ ⇒ se = ⇒ sf & ⇒ sg s ⇒ ss 

Une autre approche consisterait à transformer l'URL d'origine en un flux de bits, de préférence avec un algorithme de compression puisque vous avez déjà perdu la lisibilité, puis en affectant un symbole alphanumérique à chaque séquence de 6 bits possible. Notez que cela laisse 4 symboles alphanumériques que vous n'utilisez jamais - vous pourriez les récupérer si vous vous souciez vraiment de la longueur, mais cela ne semble guère en valoir la peine.Je n'ignorerai pas le mot "crypto" dans le sujet, puisque vous ne semblez pas très intéressé à rendre le schéma difficile à découvrir.

3

Je pense que j'ai trouvé une meilleure solution (au moins plus approprié et facile à mettre en œuvre dans mon cas)

Il est en quelque sorte un hack qui se composent de unpackking la chaîne avec le paramètre H *. Voici un échantillon du code:

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 

Je ne vais pas marquer ce que la réponse (même pas sûr que je peux ...), mais j'aimerais laisser les lecteurs savent qu'il a réellement fait la truc pour moi;)

0

tant que vous ne me dérange pas urls laid que vous pourriez faire un rapide avec évasion base64 et url:

require 'base64' 
require 'cgi' 
require 'uri' 

def encode_url(url) 
    CGI.escape(Base64.encode64(url)) 
end 

et à nouveau:

def decode_url(encoded_url) 
    Base64.decode64(CGI.unescape(encoded_url)) 
end 

Big urls laid, mais il faire le travail:

>> 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" 
1

La plupart des gens qui viennent sur cette page sont probablement à la recherche d'un moyen de générer des chaînes de style TinyURL en utilisant Ruby. (Voilà comment je l'ai trouvé.)

Les bonnes nouvelles sont que c'est super simple.

# timestamp 
>> DateTime.now.hash.abs.to_s(36) 
=> "5ynfka" 

# invite code 
>> "[email protected]".hash.to_s(36) 
=> "emhs98" 

Basé sur http://blog.internautdesign.com/2007/11/2/base-conversion-and-tiny-url-type-hashes-in-ruby

+0

C'est très très joli, en effet! Je souhaite qu'il y avait un coureur pour les questions répondues beaucoup plus tard, mais parfaitement valide! –

Questions connexes