Feature #18183
closedmake SecureRandom.choose public
Added by olleicua (Antha Auciello) about 4 years ago. Updated about 2 years ago.
Description
This issue https://bugs.ruby-lang.org/issues/10849
added SecureRandom.alphanumeric
and also the private method choose.
choose
was kept private because the method name wasn't the best name to represent the behavior.
I think if it was called random_string
it would be very clear what it does.
I also think it should be aliased to choose as well to allow backwards compatibility for people bypassing the private method with send
(e.g. https://www.thetopsites.net/article/58611103.shtml)
I'm planning to put together a pull request for this. Please let me know if there are any complications I'm not considering.
Updated by olleicua (Antha Auciello) about 4 years ago
Actions
#1
[ruby-core:105362]
Pull request here: https://github.com/ruby/ruby/pull/4878
Updated by nobu (Nobuyoshi Nakada) about 4 years ago
Actions
#2
- Related to Feature #10849: Adding an alphanumeric function to SecureRandom added
Updated by nobu (Nobuyoshi Nakada) almost 4 years ago
Actions
#3
- Related to Feature #18190: Split `Random::Formatter` from securerandom added
Updated by matz (Yukihiro Matsumoto) almost 4 years ago
Actions
#4
[ruby-core:106715]
I agree with the proposal, but choice
is not a good name for a public method.
Matz.
Updated by mame (Yusuke Endoh) over 3 years ago
Actions
#5
- Has duplicate Feature #18817: SecureRandom::choose is not being exposed added
Updated by matz (Yukihiro Matsumoto) over 3 years ago
Actions
#6
[ruby-core:108778]
- Status changed from Open to Rejected
SecureRandom.choose(*args)
is not intuitive from my POV. Use args.sample(random: SecureRandom)
.
Matz.
Updated by matz (Yukihiro Matsumoto) over 3 years ago
Actions
#7
[ruby-core:108779]
My bad. args.sample(random: SecureRandom) is not a replacement for SecureRandom.choose(*args,len).
But still, choose does not describe the behavior.
Matz.
Updated by mame (Yusuke Endoh) over 3 years ago
Actions
#8
[ruby-core:108780]
@matz (Yukihiro Matsumoto) The OP proposed random_string
. What do you think about it?
Updated by matz (Yukihiro Matsumoto) over 3 years ago
Actions
#9
[ruby-core:108783]
I don't think SecureRandom.random_string(args, len)
describes the behavior, neither.
Matz.
Updated by midnight (Sarun R) over 3 years ago
Actions
#10
[ruby-core:108785]
My bad for not searching the old topics.
In this module, (most of) the method name describes the output, not the procedure, not how to generate the output.
For example:
Method hex
outputs a hexadecimal number.
Method uuid
outputs a uuid.
The problem now is that what do we call this thing:
"5FHY5PXLT184GIVISCVESTMGO"
given that the characters come from a specific input set.
My naive self would call it a string, but it is not just any string; maybe, "string" with some adjective?
Otherwise, what I call straight from my business application is "code".
SecureRandom.code
maybe?
Updated by austin (Austin Ziegler) over 3 years ago
Actions
#11
[ruby-core:108786]
One option would be to extend Random::Formatter#alphanumeric
to have an optional "alphabet":
def alphanumeric(n=nil, alphabet: ALPHANUMERIC)
n = 16 if n.nil?
choose(alphabet, n)
end
Updated by midnight (Sarun R) over 3 years ago
Actions
#12
[ruby-core:108839]
In case we really can't agree on the name.
I reimplement the functionality as an independent class on a GitHub's Gist; without using non-public API and the send
hack, of course.
https://gist.github.com/midnight-wonderer/8fec1c670bd07f26b9466010842d2421
Usage:
code_generator = RandomCode.new(choose_from: ('A'..'Z').to_a)
code_generator.call(10)
It would be better if the functionality is in the core, though.
Updated by mame (Yusuke Endoh) over 3 years ago
Actions
#13
[ruby-core:108887]
austin (Austin Ziegler) wrote in #note-11:
One option would be to extend
Random::Formatter#alphanumeric
to have an optional "alphabet":
This approach looks nice to me. If "numeric" sounds a bit weird here, how about introducing Random::Formatter#alphabet(n = 16, alphabet: [*'A'..'Z', *'a'..'z'])
?
Updated by austin (Austin Ziegler) over 3 years ago
Actions
#14
[ruby-core:108888]
mame (Yusuke Endoh) wrote in #note-13:
austin (Austin Ziegler) wrote in #note-11:
One option would be to extend
Random::Formatter#alphanumeric
to have an optional "alphabet":This approach looks nice to me. If "numeric" sounds a bit weird here, how about introducing
Random::Formatter#alphabet(n = 16, alphabet: [*'A'..'Z', *'a'..'z'])
?
I think that #alphanumeric
might still be the better name as the alphabet could be [*'ABCDFGHKMNPQRTUVWXYZ'.split(''), *'0'..'9']
. If that’s not preferred, there are two choices, I think:
Random::Formatter#alphanumeric(n = 16, set: …)
-
Random::Formatter#from_set(set, n = 16)
(orRandom::Formatter#from_set(n = 16, set: …)
)
I think that alphabet
is still the right word here, as it’s sort of the "term of art" for this sort of thing, although set
is probably a good name as well. In any case, there should be a recommendation that the alphabet
or the set
parameter for any of these be a constant frozen value and not a localized constructed value.
Updated by olleicua (Antha Auciello) over 3 years ago
Actions
#15
[ruby-core:108889]
Random::Formatter#from_set(set, n = 16)
(orRandom::Formatter#from_set(n = 16, set: …)
)
I like Random::Formatter#from_set
or Random::Formatter#from_alphabet
because from
makes it clear what the purpose of the additional parameter is.
Random::Formatter#alphabet
would seem a little confusing to me as it could suggest that a standard a-z
alphabet of some sort is being used.
Updated by matz (Yukihiro Matsumoto) over 3 years ago
Actions
#16
[ruby-core:108954]
I prefer Random::Formatter#alphanumeric(n = 16, chars: …)
to others. But alphabet:
or set:
are acceptable too.
Matz.
Updated by mame (Yusuke Endoh) almost 3 years ago
Actions
#17
[ruby-core:111299]
- Status changed from Rejected to Assigned
- Assignee set to nobu (Nobuyoshi Nakada)
Updated by mame (Yusuke Endoh) about 2 years ago
Actions
#18
- Has duplicate Feature #19854: Make SecureRandom.choose public added
Updated by nobu (Nobuyoshi Nakada) about 2 years ago
Actions
#19
[ruby-core:114572]
Updated by nobu (Nobuyoshi Nakada) about 2 years ago
Actions
#20
- Status changed from Assigned to Closed
Applied in changeset git|7e5c662a6f2e8435f8103bc16185bed6759cc557.
[Feature #18183] Add chars:
option to Random#alphanumeric