Ruby / milyen digest-et?


require "digest"

Digest::SHA256.hexdigest("hello")
=> "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
(64 char)
Digest::SHA256.hexdigest("hello").to_i(16).to_s(36)
=> "14bu24ea7cq4jhmrgj4a3jrn1v6vem8ualnohxyeq239y1gobo"
(46-50 char)
Digest::SHA256.base64digest("hello")
=> "LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ="
(44 char)

A második tetszik a legjobban praktikai okokból (olvashatóság, karakterhossz, habár ez utóbbi változik a másodiknál), ugye itt 36-os számrendszerbe konvertálom a kimenetet. A harmadik már nem is jó ha például URL-ben is kell.

Hozzászólások

Miért ne lenne jó a harmadik url-be? Egyrészt enkódolható, másrészt ha jól tudom csak query stringben bír speciáls jelentéssel a plusz jel, az url többi részében nem.

Azért ne egy plusz urlencode döntse le a szervert a lábáról :) Mindenesetre akkor tényleg a második megoldás a legjobb.
Esetleg még rövidíthetsz, ha 36 helyett 62-es számrendszerbe tudnád konvertálni, (0-9, a-z, A-Z)

Ha nem riadsz meg a third party gemektől: https://github.com/whatyouhide/bases
vagy: https://github.com/steventen/base62-rb

Valóban, asszem ezt benéztem, ugyanis a dokumentációból úgy jött le, hogy meg lehet hívni a digestet oly módon hogy byte array legyen a visszatérési érték, de most alaposabban megnézve ez nem igaz.
Ez esetben lehetett volna rárakni az url-safe base64-et a sima helyett, de így akkor ez sztornó (bár még mindíg opció ha manuálisan cseréled le utánna a 2 inkompatibilis karaktert hogy url-ben is átmenjen).

Mégis jó amit mondasz, a sima digest metódus. Arra ráeresztve az általad linkelt metódust szerintem is ez a verzió lesz a legjobb (rövid és url safe, azt hittem karakter kimenetűre gondoltad ráereszteni a base64-et):


Base64.urlsafe_encode64(Digest::SHA256.digest("hello"))
=> "LPJNul-wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ="
(44 char)

Köszi. Benne is van hogy "wow" ;)

Mondjuk ennyiből akár el is hagyhatom az utolsó karaktert, mert az mindig "=", így 43 karakter lesz. Illetve a sima base64 is jó lehet ha kikapom belőle a nem alfanumerikus karaktereket, meggondolandó hogy mennyire romolhat így az entrópia minősége:


10.times{ p Digest::SHA256.base64digest(rand.to_s)[0..-2].gsub(/[^0-9a-zA-Z]/,"0") };

"NeNTjAE1pJh9JHu285HCqDUMpbZksoHegOcD1VLC1Hc"
"aVw0zF7n65kWlyaRxeMlyjJUBgwjyh02viREpj7s6aA"
"tXyQezUvPXqoUps07aQPIRYYFwVV2D0RY6LrsXqJu58"
"6wcQJY8O5dgap1DQSLb1WJb0vCQimZafdUaNtd0U0iY"
"2zTrjelp2Z40cXTvdKYH8OSDJTv0OvP326I1QP8mON0"
"G1Syb6IHiN1EUswNuD03FI940Yc6U9y6Ih2JeVMhhKw"
"ZT73MaoLtmSLGe9Tnw4jaZwFmTs7aV27jsZIJ51v9fw"
"kw0ugd76zG08cyYeB9fo4itON0gti7CosmpbEH1v3yM"
"9TOlvE5RbyG9tHTCKlSArdv9AECEv7nBQCZV9WOGmtQ"
"kD1jmOBf2t7IHGHYrl2YM3nMvxLMLxGJKoFDQ0o0ezA"