質問するログイン新規登録

回答編集履歴

3

さらに文章を平易に改良

2018/02/19 10:42

投稿

miyabi-sun
miyabi-sun

スコア21542

answer CHANGED
@@ -1,8 +1,14 @@
1
- その用途でよく用いられるのは[ハッシュ](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0)という文字列です。
1
+ その用途でよく用いられるのは[ハッシュ](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0)です。
2
+ 任意の文字列をハッシュに変換かける事を「ハッシュ化」と呼びます。
2
- ハッシュには多くのルールが存在します。
3
+ ハッシュには様々な用途あり、それに伴い様々な規約が存在します。
3
4
 
5
+ 今回の質問には要件として「同じ名前を入力すると同じ結果になって欲しい」があります。
6
+ これがハッシュの仕様とピタリ一致するのです。
7
+
4
- 今回はMD5というハッシュの規格を使って文字列を変換すことをオススメします。
8
+ 今回紹介するのハッシュの規約の一つであMD5です。
9
+ 有名なのでRubyにもライブラリが用意されているようですね。(標準で使えるかな?)
5
10
  [https://docs.ruby-lang.org/ja/latest/class/Digest=3a=3aBase.html](https://docs.ruby-lang.org/ja/latest/class/Digest=3a=3aBase.html)
11
+
6
12
  以下はMD5の仕様です
7
13
 
8
14
  - 16進数で表現されている
@@ -10,7 +16,6 @@
10
16
  - 同じ文字列を変換すると、同じ文字列が登場する
11
17
  - 暗号化の仕組みとしては弱いが、仕組みが単純な分速度が出る
12
18
 
13
- ハッシュ化された文字列は、同じ文字列ならば常に同じ文字列が結果として出現します。
14
19
  例えば`abc`をMD5に変換すると、必ず`'900150983cd24fb0d6963f7d28e17f72'`という文字列になります。
15
20
 
16
21
  ```Ruby
@@ -20,10 +25,12 @@
20
25
  p Digest::MD5.file('ruby-1.8.5.tar.gz').to_s #=> '3fbb02294a8ca33d4684055adba5ed6f'
21
26
  ```
22
27
 
23
- MD5の仕様の一つに「16進数」というものがありまが、
28
+ MD5にハッシュ化された文字列は「16進数」
24
29
  Rubyでは16進数の文字列を[hexメソッド](https://ref.xaio.jp/ruby/classes/string/hex)を使って簡単に数値に変換できます。
25
- それを`% 10`で余りを求めれば10パターンの結果になります!
26
30
 
31
+ 10通りの結果が欲しいのですよね?
32
+ 結果の数値を`% 10`で余りを求めれば10パターンの結果になります!
33
+
27
34
  ---
28
35
 
29
36
  【おまけ】

2

ハッシュの説明が難解だったので修正

2018/02/19 10:42

投稿

miyabi-sun
miyabi-sun

スコア21542

answer CHANGED
@@ -1,11 +1,18 @@
1
- その用途でよく用いられるのは[ハッシュ](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0)です。
1
+ その用途でよく用いられるのは[ハッシュ](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0)という文字列です。
2
+ ハッシュ化には多くのルールが存在します。
2
3
 
3
- ハッシュは本来はSSH認証鍵に用いられるもので、簡単に衝突しないように十分長い文字列のもの採用することが多いのですが、今回は簡単なおみくじ程度のものなのでMD5辺りが良いんじゃないでょうか?
4
+ 今回はMD5というハッシュの規格を使って文字列を変換することをオススメます。
4
5
  [https://docs.ruby-lang.org/ja/latest/class/Digest=3a=3aBase.html](https://docs.ruby-lang.org/ja/latest/class/Digest=3a=3aBase.html)
6
+ 以下はMD5の仕様です
5
7
 
8
+ - 16進数で表現されている
9
+ - 常に32文字に変換される
6
- こんな感でアットランダムに見える文字列
10
+ - 同じ文字列を変換ると同じ文字列が登場する
7
- 例えば`abc`結果は必ず`'900150983cd24fb0d6963f7d28e17f72'`という風に結果固定化されます。
11
+ - 暗号化仕組みしては弱いが、仕組みが単純な分速度が出る
8
12
 
13
+ ハッシュ化された文字列は、同じ文字列ならば常に同じ文字列が結果として出現します。
14
+ 例えば`abc`をMD5に変換すると、必ず`'900150983cd24fb0d6963f7d28e17f72'`という文字列になります。
15
+
9
16
  ```Ruby
10
17
  require 'digest/md5'
11
18
 
@@ -13,12 +20,10 @@
13
20
  p Digest::MD5.file('ruby-1.8.5.tar.gz').to_s #=> '3fbb02294a8ca33d4684055adba5ed6f'
14
21
  ```
15
22
 
16
- この長い文字列どうやって使うねん?ですが、
17
- MD5を始めとするハッシュ値多くは16進数(0〜9A〜F)で表現されます
23
+ MD5の仕様の一つに「16進数いうものがありますが、
18
- なので[hex関数](https://ref.xaio.jp/ruby/classes/string/hex)使て簡単に数値に戻せます。
24
+ Rubyは16進数の文字列を[hexメソッド](https://ref.xaio.jp/ruby/classes/string/hex)を使て簡単に数値に変換できます。
25
+ それを`% 10`で余りを求めれば10パターンの結果になります!
19
26
 
20
- 結果が10通りという事なので、末尾8文字程度から数値に変換して、`% 10`で余りを求めれば十分な精度になるんではないでしょうか?
21
-
22
27
  ---
23
28
 
24
29
  【おまけ】
@@ -33,16 +38,19 @@
33
38
 
34
39
  【追記】コードにしてみた
35
40
 
36
- 動くかどうか分かりませんがコードにしてみました。
41
+ ちょっとしたコードを書いてみました。
37
42
 
38
43
  ```JavaScript
39
44
  require 'digest/md5'
40
45
 
41
46
  a = Digest::MD5.hexdigest('太郎').slice(0, 3).hex
42
47
  b = Digest::MD5.hexdigest('花子').slice(0, 3).hex
43
- result = (a + b) % 10
48
+ result = (a + b) % 11
44
49
  ```
45
50
 
51
+ 0%〜100%が出てほしいなら11パターンじゃないですかね?
52
+ というわけで`% 10`ではなく、`% 11`にしました。
53
+
46
54
  MD5で16進数の文字列にして、一部の文字列だけをsclieで切り出し、hexで数値に変換。
47
55
 
48
56
  相性診断なので一度足してから`% 10`で10の余りを求めています。

1

コード書いてみた

2018/02/19 10:34

投稿

miyabi-sun
miyabi-sun

スコア21542

answer CHANGED
@@ -27,4 +27,23 @@
27
27
  中身を見たわけではないですが、十中八九このテクニックの応用です。
28
28
 
29
29
  `abc`という文字列の上に日付データを足してハッシュ値として取り出しているのです。
30
- `2018/03/12 - abc`みたいな文字列作ってMD5形式に変換…という手法にすれば簡単に日替わりの結果が作れますね。
30
+ `2018/03/12 - abc`みたいな文字列作ってMD5形式に変換…という手法にすれば簡単に日替わりの結果が作れますね。
31
+
32
+ ---
33
+
34
+ 【追記】コードにしてみた
35
+
36
+ 動くかどうか分かりませんがコードにしてみました。
37
+
38
+ ```JavaScript
39
+ require 'digest/md5'
40
+
41
+ a = Digest::MD5.hexdigest('太郎').slice(0, 3).hex
42
+ b = Digest::MD5.hexdigest('花子').slice(0, 3).hex
43
+ result = (a + b) % 10
44
+ ```
45
+
46
+ MD5で16進数の文字列にして、一部の文字列だけをsclieで切り出し、hexで数値に変換。
47
+
48
+ 相性診断なので一度足してから`% 10`で10の余りを求めています。
49
+ つまり`result`には`0 〜 9`の数値が格納されています。