質問編集履歴

4

base64について気になったことを自分で追記。

2022/03/30 02:33

投稿

marururu
marururu

スコア23

test CHANGED
File without changes
test CHANGED
@@ -1,113 +1,65 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
-
4
-
5
3
  タイムスタンプを持つとあるデータに対する「時刻情報+その他情報」による複合キーを、「できるだけ少ない文字数」かつ「どのデータでも同じ文字数」でも表現したいと考えています。
6
-
7
4
  ここで、特に「時刻情報」に関して、何某かの知恵をお借りしたいと思い投稿しました。
8
-
9
-
10
5
 
11
6
  つまり、よくある「yyyy-mm-dd HH:MM:SS」というタイムスタンプから得られる情報をを、できるだけ少ない文字数で表現したいです。
12
7
 
13
-
14
-
15
8
  例:「yyyy-mm-dd HH:MM:SS(19文字)」→「yyyymmddHHMMSS(14文字)」
16
9
 
17
-
18
-
19
10
  ただ、検索してもあまり情報がなく、自分だけの考察では手一杯な感触を得ています。
20
-
21
11
  そこで、なにか方法がないかお聞きしたく、投稿させていただきました。
22
-
23
-
24
12
 
25
13
  ※検索しても出てこない=そもそもそんなこと考えずに別の方法を考えるべきだという啓示な気もしますが…
26
14
 
27
-
28
-
29
15
  ### 試したこと
30
16
 
31
-
32
-
33
17
  日時情報を、UNIX秒に変換する方法と、変換したUNIX秒をn進数に変換する方法を思いつきました。
34
-
35
18
  ※n進数の変換は、一般に用意されるようなアルゴリズムではないと思っているため、別途何某か変換用のスクリプトを組む必要があると思っています。
36
-
37
19
  ※36進数=0~9,A~Zまでの36文字、62進数=0~9、a~z、A~Zの62文字、94進数=ASCII文字33番(0x21)[!]~126番(0x7e)[~]までの94文字と想定しています
38
-
39
20
  ※「データの圧縮」というキーワードから連想し、「可逆圧縮アルゴリズム(ランレングス符号、ハフマン符号、LZ77、LZSS、LZW、Deflateなど)」が使えないかと調べたこともあるのですが、たかだか14文字の数字データを圧縮するような話とは別では…?と思ってしまい、深くは調査しませんでした。
40
21
 
41
-
42
-
43
22
  |概要|桁数|表示データ|範囲|
44
-
45
- |:--|:--|:--|
23
+ |:--|:--|:--|:--|
46
-
47
- そのまま表記|14桁|2021/09/30 05:16:04|9999年以上
24
+ |そのまま表記|14桁|2021/09/30 05:16:04|9999年以上|
48
-
49
- UNIX秒|10桁|1632978964|9,999,999,999(10進数10桁)→'2286-11-21 02:46:39'
25
+ |UNIX秒|10桁|1632978964|9,999,999,999(10進数10桁)→'2286-11-21 02:46:39'|
50
-
51
- UNIX秒を16進数変換|8桁|61554814|0xFFFFFFFF(16進数8桁)→4,294,967,295(UNIX秒)→2106-02-07 15:28:15
26
+ |UNIX秒を16進数変換|8桁|61554814|0xFFFFFFFF(16進数8桁)→4,294,967,295(UNIX秒)→2106-02-07 15:28:15|
52
-
53
- UNIX秒を36進数変換|6桁|R08EMS|zzzzzz(36進数)→2038-12-24 05:45:35
27
+ |UNIX秒を36進数変換|6桁|R08EMS|zzzzzz(36進数)→2038-12-24 05:45:35|
54
-
55
- UNIX秒を62進数変換|6桁|1MvOqo|ZZZZZZ(62進数)→56,800,235,583(10進数)→3769-12-05 03:13:03
28
+ |UNIX秒を62進数変換|6桁|1MvOqo|ZZZZZZ(62進数)→56,800,235,583(10進数)→3769-12-05 03:13:03|
56
-
57
- UNIX秒を94進数変換|5桁|7o1RY|~~~~~~(94進数)→7,339,040,223(10進数)→2202-07-26 14:17:03
29
+ |UNIX秒を94進数変換|5桁|7o1RY|~~~~~~(94進数)→7,339,040,223(10進数)→2202-07-26 14:17:03|
58
-
59
30
 
60
31
 
61
32
  ### お聞きしたいこと
62
-
63
33
  以下の2点についてお聞きしたいです。
64
-
65
34
  1. **上記アプローチが、あまりにも突拍子のない、変な方法なのかどうか?**
66
-
67
35
  2. **他に考えられる方法はないか?**
68
-
69
-
70
-
71
36
 
72
37
 
73
38
  おかしな質問かもしれませんが、、何卒よろしくおねがいします。
74
39
 
75
40
 
41
+ ### 追加検討した結果
42
+ #### UNIX秒をオフセットする
43
+ UNIX秒は1970/1/1からの経過秒数なので、固定値でオフセットし、2020/1/1からの経過秒数にしてみる。
44
+ →表示できる範囲が50年分だけ後ろにオフセットされる。ただし、"桁数"の観点からからいうと、表示できる範囲が変わるわけではないので、長いスパンで考えると大差なく、桁数を削減できるほどの効果は得られないと思われる。
45
+
46
+ **0秒='1970/1/1'を基準にした場合(通常) → 0秒='2020/1/1'を基準にし直した場合(工夫あり)**
47
+ |桁数|unix秒(開始)|unix秒(終了)|表現できる範囲(開始)|表現できる範囲(終了)|50年分オフセットした場合(終了)|
48
+ |:--|:--|:--|:--|:--|:--|
49
+ |1|0|9|1970/01/01 00:00:00|1970/01/01 00:00:09|2020/01/01 00:00:09|
50
+ |2|0|99|1970/01/01 00:00:00|1970/01/01 00:01:39|2020/01/01 00:01:39|
51
+ |3|0|999|1970/01/01 00:00:00|1970/01/01 00:16:39|2020/01/01 00:16:39|
52
+ |4|0|9999|1970/01/01 00:00:00|1970/01/01 02:46:39|2020/01/01 02:46:39|
53
+ |5|0|99999|1970/01/01 00:00:00|1970/01/02 03:46:39|2020/01/02 03:46:39|
54
+ |6|0|999999|1970/01/01 00:00:00|1970/01/12 13:46:39|2020/01/12 13:46:39|
55
+ |7|0|9999999|1970/01/01 00:00:00|1970/04/26 17:46:39|2020/04/25 17:46:39|
56
+ |8|0|99999999|1970/01/01 00:00:00|1973/03/03 09:46:39|2023/03/03 09:46:39|
57
+ |9|0|999999999|1970/01/01 00:00:00|2001/09/09 01:46:39|2051/09/09 01:46:39|
58
+ |10|0|9999999999|1970/01/01 00:00:00|2286/11/20 17:46:39|2336/11/20 17:46:39|
76
59
 
77
60
 
78
-
79
- ### 追加検討した結果
80
-
81
- #### UNIX秒をオフセットする
61
+ #### base64で変換する
82
-
62
+ 元のバイナリデータを、アルファベットの小文字(a~zの26文字)とアルファベットの大文字(A~Zの26文字)と数字0~9(の10文字)と「+」と「/」の計64文字を用いた文字列でエンコードするものです。上述で投稿者が勝手に考えた基数変換とは微妙に異なるものだと思っています。
83
- UNIX秒は1970/1/1からの経過秒なので、固定値でオフセットし、2020/1/1から経過秒数る。
63
+ 使い方としては、「UNIX秒」を「整型」とていったん「バイナリ」に変換しbase64ルール則っ、「6bitずつ文字列にエンコード」す感じです
84
-
85
- →表示できる範囲が50年分だけ後ろにオフセットされる。ただし、"桁数"の観点からからいうと、表示できる範囲が変わるわけではないので、長いスパンで考えると大差なく、桁数を削減できるほどの効果は得られないと思われる。
86
-
87
-
88
-
89
- **0秒='1970/1/1'を基準にした場合(通常) → 0秒='2020/1/1'を基準にし直した場合(工夫あり)**
90
-
91
- |桁数|unix秒(開始)|unix秒(終了)|表現きる範囲(開始)|表現きる範囲(終了)|50年分オフセットした場合(終了)
64
+ エンコード結果は4文字区切りないといけないの、4文字or8文字or12文字…となります。
92
-
93
- |:--|:--|:--|:--|:--|
94
-
95
- 1|0|9|1970/01/01 00:00:00|1970/01/01 00:00:09|2020/01/01 00:00:09
65
+ 「64文字x8桁」の表現ができれば、281,474,976,710,656(281兆通り)の情報量を持つことができるので、もしミリ秒UNIX秒にしても事足りそうな気がします。
96
-
97
- 2|0|99|1970/01/01 00:00:00|1970/01/01 00:01:39|2020/01/01 00:01:39
98
-
99
- 3|0|999|1970/01/01 00:00:00|1970/01/01 00:16:39|2020/01/01 00:16:39
100
-
101
- 4|0|9999|1970/01/01 00:00:00|1970/01/01 02:46:39|2020/01/01 02:46:39
102
-
103
- 5|0|99999|1970/01/01 00:00:00|1970/01/02 03:46:39|2020/01/02 03:46:39
104
-
105
- 6|0|999999|1970/01/01 00:00:00|1970/01/12 13:46:39|2020/01/12 13:46:39
106
-
107
- 7|0|9999999|1970/01/01 00:00:00|1970/04/26 17:46:39|2020/04/25 17:46:39
108
-
109
- 8|0|99999999|1970/01/01 00:00:00|1973/03/03 09:46:39|2023/03/03 09:46:39
110
-
111
- 9|0|999999999|1970/01/01 00:00:00|2001/09/09 01:46:39|2051/09/09 01:46:39
112
-
113
- 10|0|9999999999|1970/01/01 00:00:00|2286/11/20 17:46:39|2336/11/20 17:46:39

3

表のデータが間違っていたので修正

2021/11/02 10:57

投稿

marururu
marururu

スコア23

test CHANGED
File without changes
test CHANGED
@@ -48,9 +48,9 @@
48
48
 
49
49
  UNIX秒|10桁|1632978964|9,999,999,999(10進数10桁)→'2286-11-21 02:46:39'
50
50
 
51
- UNIX秒を16進数変換|8桁|61554814|0xFFFFFFFF(16進数8桁)→68,719,476,735(UNIX秒)→4147-08-20 07:32:15
51
+ UNIX秒を16進数変換|8桁|61554814|0xFFFFFFFF(16進数8桁)→4,294,967,295(UNIX秒)→2106-02-07 15:28:15
52
52
 
53
- UNIX秒を36進数変換|6桁|r08ems~|zzzzzz(36進数)→2038-12-24 05:45:35
53
+ UNIX秒を36進数変換|6桁|R08EMS|zzzzzz(36進数)→2038-12-24 05:45:35
54
54
 
55
55
  UNIX秒を62進数変換|6桁|1MvOqo|ZZZZZZ(62進数)→56,800,235,583(10進数)→3769-12-05 03:13:03
56
56
 

2

指摘を反映(93文字→94文字)、ほか表現で誤解を生みそうな箇所を修正

2021/11/02 10:57

投稿

marururu
marururu

スコア23

test CHANGED
File without changes
test CHANGED
@@ -2,13 +2,19 @@
2
2
 
3
3
 
4
4
 
5
- あるデータに対して、ユニークなキーを付与する目的として、「時刻情報」を一部とて利用したいと考えています。
5
+ タイムスタンプを持つとあるデータに対する「時刻情報+その他情報による複合キー、「できるだけ少ない文字数」かつ「どデータでも同じ文字数」でも表現したいと考えています。
6
6
 
7
- またこの情報は「できるだけ少ない文字数、かつ「どデータでも同じ文字数」で表現したいと考えていま
7
+ ここで特に「時刻情報」に関して何某かの知恵をお借りしたいと投稿しした
8
8
 
9
9
 
10
10
 
11
- つまり、よくある「yyyy-mm-dd HH:MM:SS」といった14個の数字並びを、できるだけ少ない文字数で表現したいです。
11
+ つまり、よくある「yyyy-mm-dd HH:MM:SS」というタイムスタンプから得られる情報をを、できるだけ少ない文字数で表現したいです。
12
+
13
+
14
+
15
+ 例:「yyyy-mm-dd HH:MM:SS(19文字)」→「yyyymmddHHMMSS(14文字)」
16
+
17
+
12
18
 
13
19
  ただ、検索してもあまり情報がなく、自分だけの考察では手一杯な感触を得ています。
14
20
 
@@ -28,7 +34,7 @@
28
34
 
29
35
  ※n進数の変換は、一般に用意されるようなアルゴリズムではないと思っているため、別途何某か変換用のスクリプトを組む必要があると思っています。
30
36
 
31
- ※36進数=0~9,A~Zまでの36文字、62進数=0~9、a~z、A~Zの62文字、93進数=ASCII文字33番(0x21)[!]~126番(0x7e)[~]までの93文字と想定しています
37
+ ※36進数=0~9,A~Zまでの36文字、62進数=0~9、a~z、A~Zの62文字、94進数=ASCII文字33番(0x21)[!]~126番(0x7e)[~]までの94文字と想定しています
32
38
 
33
39
  ※「データの圧縮」というキーワードから連想し、「可逆圧縮アルゴリズム(ランレングス符号、ハフマン符号、LZ77、LZSS、LZW、Deflateなど)」が使えないかと調べたこともあるのですが、たかだか14文字の数字データを圧縮するような話とは別では…?と思ってしまい、深くは調査しませんでした。
34
40
 
@@ -44,9 +50,11 @@
44
50
 
45
51
  UNIX秒を16進数変換|8桁|61554814|0xFFFFFFFF(16進数8桁)→68,719,476,735(UNIX秒)→4147-08-20 07:32:15
46
52
 
47
- UNIX秒を62進数変換|6桁|1MvOqo|ZZZZZZ(62進数)→56800235583(10進数)→3769-12-05 03:13:03
53
+ UNIX秒を36進数変換|6桁|r08ems~|zzzzzz(36進数)→2038-12-24 05:45:35
48
54
 
55
+ UNIX秒を62進数変換|6桁|1MvOqo|ZZZZZZ(62進数)→56,800,235,583(10進数)→3769-12-05 03:13:03
56
+
49
- UNIX秒を93進数変換|5桁|7o1RY|~~~~~~(93進数)→6956883692(10進数)→2190-06-15 11:41:32
57
+ UNIX秒を94進数変換|5桁|7o1RY|~~~~~~(94進数)→7,339,040,223(10進数)→2202-07-26 14:17:03
50
58
 
51
59
 
52
60
 
@@ -74,62 +82,32 @@
74
82
 
75
83
  UNIX秒は1970/1/1からの経過秒数なので、固定値でオフセットし、2020/1/1からの経過秒数にしてみる。
76
84
 
77
- →桁数の観点からは、文字削減にはあまり効果さそう…
85
+ 表示できる範囲が50年分だけ後ろにオフセットされる。ただし、"桁数"の観点からからいうと、表示できる範囲が変わるわけでないので長いスパンで考えると大差なく、桁削減できるほどの効果は得られいと思われる。
78
86
 
79
87
 
80
88
 
81
- **0秒=1970/1/1を基準にした場合**
89
+ **0秒='1970/1/1'を基準にした場合(通常) → 0秒='2020/1/1'を基準にし直した場合(工夫あり)**
82
90
 
83
- |桁数|unix秒(開始)|unix秒(終了)|表現できる範囲(開始)|表現できる範囲(終了)|
91
+ |桁数|unix秒(開始)|unix秒(終了)|表現できる範囲(開始)|表現できる範囲(終了)|50年分オフセットした場合(終了)
84
92
 
85
93
  |:--|:--|:--|:--|:--|
86
94
 
87
- 1|0|9|1970/01/01 00:00:00|1970/01/01 00:00:09
95
+ 1|0|9|1970/01/01 00:00:00|1970/01/01 00:00:09|2020/01/01 00:00:09
88
96
 
89
- 2|0|99|1970/01/01 00:00:00|1970/01/01 00:01:39
97
+ 2|0|99|1970/01/01 00:00:00|1970/01/01 00:01:39|2020/01/01 00:01:39
90
98
 
91
- 3|0|999|1970/01/01 00:00:00|1970/01/01 00:16:39
99
+ 3|0|999|1970/01/01 00:00:00|1970/01/01 00:16:39|2020/01/01 00:16:39
92
100
 
93
- 4|0|9999|1970/01/01 00:00:00|1970/01/01 02:46:39
101
+ 4|0|9999|1970/01/01 00:00:00|1970/01/01 02:46:39|2020/01/01 02:46:39
94
102
 
95
- 5|0|99999|1970/01/01 00:00:00|1970/01/02 03:46:39
103
+ 5|0|99999|1970/01/01 00:00:00|1970/01/02 03:46:39|2020/01/02 03:46:39
96
104
 
97
- 6|0|999999|1970/01/01 00:00:00|1970/01/12 13:46:39
105
+ 6|0|999999|1970/01/01 00:00:00|1970/01/12 13:46:39|2020/01/12 13:46:39
98
106
 
99
- 7|0|9999999|1970/01/01 00:00:00|1970/04/26 17:46:39
107
+ 7|0|9999999|1970/01/01 00:00:00|1970/04/26 17:46:39|2020/04/25 17:46:39
100
108
 
101
- 8|0|99999999|1970/01/01 00:00:00|1973/03/03 09:46:39
109
+ 8|0|99999999|1970/01/01 00:00:00|1973/03/03 09:46:39|2023/03/03 09:46:39
102
110
 
103
- 9|0|999999999|1970/01/01 00:00:00|2001/09/09 01:46:39
111
+ 9|0|999999999|1970/01/01 00:00:00|2001/09/09 01:46:39|2051/09/09 01:46:39
104
112
 
105
- 10|0|9999999999|1970/01/01 00:00:00|2286/11/20 17:46:39
113
+ 10|0|9999999999|1970/01/01 00:00:00|2286/11/20 17:46:39|2336/11/20 17:46:39
106
-
107
-
108
-
109
-
110
-
111
- **0秒=2020/1/1を基準にした場合**
112
-
113
- 桁数|unix秒(開始)|unix秒(終了)|表現できる範囲(開始)|表現できる範囲(終了)
114
-
115
- |:--|:--|:--|:--|:--|
116
-
117
- 1|0|9|2020/01/01 00:00:00|2020/01/01 00:00:09
118
-
119
- 2|0|99|2020/01/01 00:00:00|2020/01/01 00:01:39
120
-
121
- 3|0|999|2020/01/01 00:00:00|2020/01/01 00:16:39
122
-
123
- 4|0|9999|2020/01/01 00:00:00|2020/01/01 02:46:39
124
-
125
- 5|0|99999|2020/01/01 00:00:00|2020/01/02 03:46:39
126
-
127
- 6|0|999999|2020/01/01 00:00:00|2020/01/12 13:46:39
128
-
129
- 7|0|9999999|2020/01/01 00:00:00|2020/04/25 17:46:39
130
-
131
- 8|0|99999999|2020/01/01 00:00:00|2023/03/03 09:46:39
132
-
133
- 9|0|999999999|2020/01/01 00:00:00|2051/09/09 01:46:39
134
-
135
- 10|0|9999999999|2020/01/01 00:00:00|2336/11/20 17:46:39

1

UNIX秒をオフセットする方法に関する追加検討の内容を追記

2021/10/04 08:54

投稿

marururu
marururu

スコア23

test CHANGED
File without changes
test CHANGED
@@ -63,3 +63,73 @@
63
63
 
64
64
 
65
65
  おかしな質問かもしれませんが、、何卒よろしくおねがいします。
66
+
67
+
68
+
69
+
70
+
71
+ ### 追加検討した結果
72
+
73
+ #### UNIX秒をオフセットする
74
+
75
+ UNIX秒は1970/1/1からの経過秒数なので、固定値でオフセットし、2020/1/1からの経過秒数にしてみる。
76
+
77
+ →桁数の観点からは、文字数の削減にはあまり効果がなさそう…
78
+
79
+
80
+
81
+ **0秒=1970/1/1を基準にした場合**
82
+
83
+ |桁数|unix秒(開始)|unix秒(終了)|表現できる範囲(開始)|表現できる範囲(終了)|
84
+
85
+ |:--|:--|:--|:--|:--|
86
+
87
+ 1|0|9|1970/01/01 00:00:00|1970/01/01 00:00:09
88
+
89
+ 2|0|99|1970/01/01 00:00:00|1970/01/01 00:01:39
90
+
91
+ 3|0|999|1970/01/01 00:00:00|1970/01/01 00:16:39
92
+
93
+ 4|0|9999|1970/01/01 00:00:00|1970/01/01 02:46:39
94
+
95
+ 5|0|99999|1970/01/01 00:00:00|1970/01/02 03:46:39
96
+
97
+ 6|0|999999|1970/01/01 00:00:00|1970/01/12 13:46:39
98
+
99
+ 7|0|9999999|1970/01/01 00:00:00|1970/04/26 17:46:39
100
+
101
+ 8|0|99999999|1970/01/01 00:00:00|1973/03/03 09:46:39
102
+
103
+ 9|0|999999999|1970/01/01 00:00:00|2001/09/09 01:46:39
104
+
105
+ 10|0|9999999999|1970/01/01 00:00:00|2286/11/20 17:46:39
106
+
107
+
108
+
109
+
110
+
111
+ **0秒=2020/1/1を基準にした場合**
112
+
113
+ 桁数|unix秒(開始)|unix秒(終了)|表現できる範囲(開始)|表現できる範囲(終了)
114
+
115
+ |:--|:--|:--|:--|:--|
116
+
117
+ 1|0|9|2020/01/01 00:00:00|2020/01/01 00:00:09
118
+
119
+ 2|0|99|2020/01/01 00:00:00|2020/01/01 00:01:39
120
+
121
+ 3|0|999|2020/01/01 00:00:00|2020/01/01 00:16:39
122
+
123
+ 4|0|9999|2020/01/01 00:00:00|2020/01/01 02:46:39
124
+
125
+ 5|0|99999|2020/01/01 00:00:00|2020/01/02 03:46:39
126
+
127
+ 6|0|999999|2020/01/01 00:00:00|2020/01/12 13:46:39
128
+
129
+ 7|0|9999999|2020/01/01 00:00:00|2020/04/25 17:46:39
130
+
131
+ 8|0|99999999|2020/01/01 00:00:00|2023/03/03 09:46:39
132
+
133
+ 9|0|999999999|2020/01/01 00:00:00|2051/09/09 01:46:39
134
+
135
+ 10|0|9999999999|2020/01/01 00:00:00|2336/11/20 17:46:39