tutorial - Qual è il modo migliore per cancellare un URL in ruby?




ruby version (2)

Sto scrivendo un'app Web che punta a collegamenti esterni. Sto cercando di creare un ID non sequenziale e non immaginabile per ogni documento che posso utilizzare nell'URL. Ho fatto la cosa ovvia: ho trattato l'url come una stringa e str # crypt su di esso, ma questo sembra soffocare qualsiasi carattere non alfanumerico, come le barre, i punti e i caratteri di sottolineatura.

Qualche suggerimento sul modo migliore per risolvere questo problema?

Grazie!


A seconda di quanto a lungo vuoi utilizzare una stringa, puoi utilizzare alcune alternative:

require 'digest'
Digest.hexencode('http://foo-bar.com/yay/?foo=bar&a=22')
# "687474703a2f2f666f6f2d6261722e636f6d2f7961792f3f666f6f3d62617226613d3232"

require 'digest/md5'
Digest::MD5.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22')
# "43facc5eb5ce09fd41a6b55dba3fe2fe"

require 'digest/sha1'
Digest::SHA1.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22')
# "2aba83b05dc9c2d9db7e5d34e69787d0a5e28fc5"

require 'digest/sha2'
Digest::SHA2.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22')
# "e78f3d17c1c0f8d8c4f6bd91f175287516ecf78a4027d627ebcacfca822574b2"

Si noti che questo non sarà incurabile, potrebbe essere necessario combinarlo con altri dati (segreti ma statici) per salare la stringa:

salt = 'foobar'
Digest::SHA1.hexdigest(salt + 'http://foo-bar.com/yay/?foo=bar&a=22')
# "dbf43aff5e808ae471aa1893c6ec992088219bbb"

Ora diventa molto più difficile generare questo hash per qualcuno che non conosce il contenuto originale e non ha accesso alla tua fonte.


Suggerirei anche di guardare i diversi algoritmi nello spazio dei nomi digest. Per rendere più difficile da indovinare, piuttosto che (o in aggiunta a) salare con una passphrase segreta, puoi anche usare una discarica precisa del tempo:

require 'digest/md5'
def hash_url(url)
  Digest::MD5.hexdigest("#{Time.now.to_f}--#{url}")
end

Poiché il risultato di un algoritmo di hashing non è garantito come univoco, non dimenticare di verificare l'unicità del risultato rispetto agli hash generati in precedenza, prima di assumere che il tuo hash sia utilizzabile. L'uso di Time.now rende il tentativo semplice da implementare, poiché è necessario chiamare fino a quando non viene generato un hash univoco.





ruby