回答編集履歴

3

さらに文章を平易に改良

2018/02/19 10:42

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -1,12 +1,24 @@
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
+ 任意の文字列をハッシュに変換かける事を「ハッシュ化」と呼びます。
4
+
3
- ハッシュには多くのルールが存在します。
5
+ ハッシュには様々な用途あり、それに伴い様々な規約が存在します。
4
6
 
5
7
 
6
8
 
9
+ 今回の質問には要件として「同じ名前を入力すると同じ結果になって欲しい」があります。
10
+
11
+ これがハッシュの仕様とピタリ一致するのです。
12
+
13
+
14
+
7
- 今回はMD5というハッシュの規格を使って文字列を変換すことをオススメします。
15
+ 今回紹介するのハッシュの規約の一つであMD5です。
16
+
17
+ 有名なのでRubyにもライブラリが用意されているようですね。(標準で使えるかな?)
8
18
 
9
19
  [https://docs.ruby-lang.org/ja/latest/class/Digest=3a=3aBase.html](https://docs.ruby-lang.org/ja/latest/class/Digest=3a=3aBase.html)
20
+
21
+
10
22
 
11
23
  以下はMD5の仕様です
12
24
 
@@ -21,8 +33,6 @@
21
33
  - 暗号化の仕組みとしては弱いが、仕組みが単純な分速度が出る
22
34
 
23
35
 
24
-
25
- ハッシュ化された文字列は、同じ文字列ならば常に同じ文字列が結果として出現します。
26
36
 
27
37
  例えば`abc`をMD5に変換すると、必ず`'900150983cd24fb0d6963f7d28e17f72'`という文字列になります。
28
38
 
@@ -42,11 +52,15 @@
42
52
 
43
53
 
44
54
 
45
- MD5の仕様の一つに「16進数」というものがありまが、
55
+ MD5にハッシュ化された文字列は「16進数」
46
56
 
47
57
  Rubyでは16進数の文字列を[hexメソッド](https://ref.xaio.jp/ruby/classes/string/hex)を使って簡単に数値に変換できます。
48
58
 
59
+
60
+
61
+ 10通りの結果が欲しいのですよね?
62
+
49
- それを`% 10`で余りを求めれば10パターンの結果になります!
63
+ 結果の数値を`% 10`で余りを求めれば10パターンの結果になります!
50
64
 
51
65
 
52
66
 

2

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

2018/02/19 10:42

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -1,16 +1,30 @@
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
+
3
+ ハッシュ化には多くのルールが存在します。
2
4
 
3
5
 
4
6
 
5
- ハッシュは本来はSSH認証鍵に用いられるもので、簡単に衝突しないように十分長い文字列のもの採用することが多いのでが、今回は簡単なおみくじ程度のものなのでMD5辺りが良いんじゃないでしょうか?
7
+ 今回はMD5というハッシュの規格を使って文字列を変換することをオススメしま
6
8
 
7
9
  [https://docs.ruby-lang.org/ja/latest/class/Digest=3a=3aBase.html](https://docs.ruby-lang.org/ja/latest/class/Digest=3a=3aBase.html)
8
10
 
11
+ 以下はMD5の仕様です
9
12
 
10
13
 
11
- こんな感じでアットランダムに見える文字列ですが、
12
14
 
15
+ - 16進数で表現されている
16
+
17
+ - 常に32文字に変換される
18
+
19
+ - 同じ文字列を変換すると、同じ文字列が登場する
20
+
21
+ - 暗号化の仕組みとしては弱いが、仕組みが単純な分速度が出る
22
+
23
+
24
+
25
+ ハッシュ化された文字列は、同じ文字列ならば常に同じ文字列が結果として出現します。
26
+
13
- 例えば`abc`の結果は必ず`'900150983cd24fb0d6963f7d28e17f72'`という結果が固定化されます。
27
+ 例えば`abc`をMD5に変換すると、必ず`'900150983cd24fb0d6963f7d28e17f72'`という文字列なります。
14
28
 
15
29
 
16
30
 
@@ -28,15 +42,11 @@
28
42
 
29
43
 
30
44
 
31
- 文字列どやって使うねん?ですが、
45
+ MD5仕様の一つに「16進数」というものがありますが、
32
46
 
33
- MD5を始めとするハッシュ値の多くは16進数(0〜9とA〜F)で表現されます。
47
+ Rubyでは16進数の文字列を[hexメソッド](https://ref.xaio.jp/ruby/classes/string/hex)を使って簡単に数値に変換ます。
34
48
 
35
- なので[hex関数](https://ref.xaio.jp/ruby/classes/string/hex)等を駆使して簡単に数値に戻せます。
36
-
37
-
38
-
39
- 結果が10通りという事なので、末尾8文字程度から数値に変換して、`% 10`で余りを求めれば十分な精度になるんではないでしょうか?
49
+ それを`% 10`で余りを求めれば10パターンの結果になります!
40
50
 
41
51
 
42
52
 
@@ -68,7 +78,7 @@
68
78
 
69
79
 
70
80
 
71
- 動くかどうか分かりませんがコードにしてみました。
81
+ ちょっとしたコードを書いてみました。
72
82
 
73
83
 
74
84
 
@@ -82,9 +92,15 @@
82
92
 
83
93
  b = Digest::MD5.hexdigest('花子').slice(0, 3).hex
84
94
 
85
- result = (a + b) % 10
95
+ result = (a + b) % 11
86
96
 
87
97
  ```
98
+
99
+
100
+
101
+ 0%〜100%が出てほしいなら11パターンじゃないですかね?
102
+
103
+ というわけで`% 10`ではなく、`% 11`にしました。
88
104
 
89
105
 
90
106
 

1

コード書いてみた

2018/02/19 10:34

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -57,3 +57,41 @@
57
57
  `abc`という文字列の上に日付データを足してハッシュ値として取り出しているのです。
58
58
 
59
59
  `2018/03/12 - abc`みたいな文字列作ってMD5形式に変換…という手法にすれば簡単に日替わりの結果が作れますね。
60
+
61
+
62
+
63
+ ---
64
+
65
+
66
+
67
+ 【追記】コードにしてみた
68
+
69
+
70
+
71
+ 動くかどうか分かりませんがコードにしてみました。
72
+
73
+
74
+
75
+ ```JavaScript
76
+
77
+ require 'digest/md5'
78
+
79
+
80
+
81
+ a = Digest::MD5.hexdigest('太郎').slice(0, 3).hex
82
+
83
+ b = Digest::MD5.hexdigest('花子').slice(0, 3).hex
84
+
85
+ result = (a + b) % 10
86
+
87
+ ```
88
+
89
+
90
+
91
+ MD5で16進数の文字列にして、一部の文字列だけをsclieで切り出し、hexで数値に変換。
92
+
93
+
94
+
95
+ 相性診断なので一度足してから`% 10`で10の余りを求めています。
96
+
97
+ つまり`result`には`0 〜 9`の数値が格納されています。