Mam formularz na stronie internetowej, która pobiera pewne dane osobowe od odwiedzających. Przekazuję tę informację do innej usługi i muszę przypisać każdą z tych formularzy, składającą unikatowy skrót o długości 100 znaków, który będzie przechowywany w bazie danych z rekordem. Jaki jest optymalny sposób wygenerowania tego klucza i upewnienia się, że jest wyjątkowy? Jest w porządku, jeśli klucz automatycznie się zwiększa.Przypisywanie każdemu użytkownikowi unikalnego 100-znakowego hasza w Ruby on Rails
9
A
Odpowiedz
22
ActiveSupport::SecureRandom.hex(50)
Szansa na to, że nie jest wyjątkowa, jest astronomiczna.
Alternatywne proste rozwiązanie problemu "nie skaluje".
class MyModel < ActiveRecord::Base
before_create :assign_unique_token
private
def assign_unique_token
self.unique_token = ActiveSupport::SecureRandom.hex(50) until unique_token?
end
def unique_token?
self.class.count(:conditions => {:unique_token => unique_token}) == 0
end
end
Jeśli naprawdę chcesz się upewnić, zrobić unikatowy indeks na kolumnie i obsługiwać DB unikatowości błąd poprzez ponowną próbą, podobnym do mojego realizacji powyżej.
2
Ruby standardowy lib posiada moduł do generowania identyfikatorów GUID:
http://ruby-doc.org/stdlib/libdoc/digest/rdoc/classes/Digest/SHA2.html
Przykład:
Digest::SHA1.hexdigest(Time.now.to_s)
0
Jeśli używasz szyfr można zaszyfrować zawsze inny komunikat, aby uzyskać zawsze inny klucz:
def encrypt(data, key, cipher_type)
aes = OpenSSL::Cipher::Cipher.new(cipher_type)
aes.encrypt
aes.key = key
aes.update(data) + aes.final
end
>> Base64.encode64(encrypt(Time.now.to_s, "some_key_long_enough_for_the_job", "AES-256-ECB"))
=> "sKJU3qhszV30Ya9vMFvbqIXus+QygICdDyr7UQFWLeM=\n"
Powiązane problemy
- 1. Przypisywanie głębi każdemu węzłowi
- 2. Ruby on Rails on IIS?
- 3. Ruby on Rails: menu rozwijane
- 4. Ruby vs. Ruby On Rails
- 5. Przełącznik Ruby on Rails
- 6. Docsplit Ruby on Rails
- 7. Narzędzia raportowania Ruby on Rails?
- 8. Ruby on Rails javascript_include_tag: domyślnie
- 9. Ruby on Rails kontra Python
- 10. Ruby on Rails vs. Django
- 11. Ruby on Rails link_to obrazu
- 12. Ruby on Rails: wybierz formularz
- 13. Stowarzyszenie polimorficzne Ruby on Rails
- 14. Ruby on Rails wysyłania SMS
- 15. Ruby on Rails 301 przekierowanie
- 16. Ruby on rails i Node.js
- 17. Ruby on Rails: Wyszukiwanie zaawansowane
- 18. Ruby on Rails before_filter vs initialized ruby
- 19. Ruby on Rails. Unicode routes
- 20. Antypatterns z Ruby on Rails
- 21. Ruby on Rails coffeescript braku
- 22. Zwijanie na Ruby on Rails
- 23. Pakiety Ruby on Rails downgrade
- 24. Ruby on Rails I18n interpolation
- 25. RVM Ruby on Rails instalacja
- 26. Monit Ruby on Rails Sidekiq
- 27. Ruby on Rails Private Methods?
- 28. Konwersja projektu Ruby on Rails do projektu JRuby on Rails
- 29. JRuby on Rails vs. Ruby on Rails, co za różnica?
- 30. Jak łatać małpy w Ruby on Rails?
W Railsach powyżej 3.1 stało się to po prostu "SecureRandom.hex (50)". – Bulat
Dwie rzeczy, o których warto wspomnieć, po prostu dmuchnęły 10 min lub tak: 1. 'SecureRandom.hex (n)' podwaja 'n' jako długość znaku w wygenerowanym kodzie (więc nic ponad 120 lub cokolwiek w przypadku typów łańcuchów Postgres) 2. Nie zapomnij zapisać modelu po przypisaniu wartości! (duh) –