base62 encode/decode
This commit is contained in:
parent
6245d24c83
commit
e16f8506ef
|
@ -0,0 +1,58 @@
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% Copyright (c) 2016 Feng Lee <feng@emqtt.io>.
|
||||||
|
%%
|
||||||
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
%% you may not use this file except in compliance with the License.
|
||||||
|
%% You may obtain a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing, software
|
||||||
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
%% See the License for the specific language governing permissions and
|
||||||
|
%% limitations under the License.
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(emqttd_base62).
|
||||||
|
|
||||||
|
-export([encode/1, decode/1]).
|
||||||
|
|
||||||
|
%% @doc Encode an integer to base62 string
|
||||||
|
-spec(encode(non_neg_integer()) -> binary()).
|
||||||
|
encode(I) when is_integer(I) andalso I > 0 ->
|
||||||
|
list_to_binary(encode(I, [])).
|
||||||
|
|
||||||
|
encode(I, Acc) when I < 62 ->
|
||||||
|
[char(I) | Acc];
|
||||||
|
encode(I, Acc) ->
|
||||||
|
encode(I div 62, [char(I rem 62) | Acc]).
|
||||||
|
|
||||||
|
char(I) when I < 10 ->
|
||||||
|
$0 + I;
|
||||||
|
|
||||||
|
char(I) when I < 36 ->
|
||||||
|
$A + I - 10;
|
||||||
|
|
||||||
|
char(I) when I < 62 ->
|
||||||
|
$a + I - 36.
|
||||||
|
|
||||||
|
%% @doc Decode base62 string to an integer
|
||||||
|
-spec(decode(string() | binary()) -> integer()).
|
||||||
|
decode(B) when is_binary(B) ->
|
||||||
|
decode(binary_to_list(B));
|
||||||
|
decode(S) when is_list(S) ->
|
||||||
|
decode(S, 0).
|
||||||
|
|
||||||
|
decode([], I) ->
|
||||||
|
I;
|
||||||
|
decode([C|S], I) ->
|
||||||
|
decode(S, I * 62 + byte(C)).
|
||||||
|
|
||||||
|
byte(C) when $0 =< C andalso C =< $9 ->
|
||||||
|
C - $0;
|
||||||
|
byte(C) when $A =< C andalso C =< $Z ->
|
||||||
|
C - $A + 10;
|
||||||
|
byte(C) when $a =< C andalso C =< $z ->
|
||||||
|
C - $a + 36.
|
||||||
|
|
|
@ -28,9 +28,11 @@
|
||||||
|
|
||||||
-define(PQ, priority_queue).
|
-define(PQ, priority_queue).
|
||||||
|
|
||||||
|
-define(BASE62, emqttd_base62).
|
||||||
|
|
||||||
all() -> [{group, guid}, {group, opts},
|
all() -> [{group, guid}, {group, opts},
|
||||||
{group, ?PQ}, {group, time},
|
{group, ?PQ}, {group, time},
|
||||||
{group, node}].
|
{group, node}, {group, base62}].
|
||||||
|
|
||||||
groups() ->
|
groups() ->
|
||||||
[{guid, [], [guid_gen]},
|
[{guid, [], [guid_gen]},
|
||||||
|
@ -38,7 +40,8 @@ groups() ->
|
||||||
{?PQ, [], [priority_queue_plen,
|
{?PQ, [], [priority_queue_plen,
|
||||||
priority_queue_out2]},
|
priority_queue_out2]},
|
||||||
{time, [], [time_now_to_]},
|
{time, [], [time_now_to_]},
|
||||||
{node, [], [node_is_aliving, node_parse_name]}].
|
{node, [], [node_is_aliving, node_parse_name]},
|
||||||
|
{base62, [], [base62_encode]}].
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% emqttd_guid
|
%% emqttd_guid
|
||||||
|
@ -144,3 +147,17 @@ node_parse_name(_) ->
|
||||||
'a@127.0.0.1' = emqttd_node:parse_name("a@127.0.0.1"),
|
'a@127.0.0.1' = emqttd_node:parse_name("a@127.0.0.1"),
|
||||||
'b@127.0.0.1' = emqttd_node:parse_name("b").
|
'b@127.0.0.1' = emqttd_node:parse_name("b").
|
||||||
|
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% base62 encode decode
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
|
||||||
|
base62_encode(_) ->
|
||||||
|
10 = ?BASE62:decode(?BASE62:encode(10)),
|
||||||
|
100 = ?BASE62:decode(?BASE62:encode(100)),
|
||||||
|
9999 = ?BASE62:decode(?BASE62:encode(9999)),
|
||||||
|
65535 = ?BASE62:decode(?BASE62:encode(65535)),
|
||||||
|
<<X:128/unsigned-big-integer>> = emqttd_guid:gen(),
|
||||||
|
<<Y:128/unsigned-big-integer>> = emqttd_guid:gen(),
|
||||||
|
X = ?BASE62:decode(?BASE62:encode(X)),
|
||||||
|
Y = ?BASE62:decode(?BASE62:encode(Y)).
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue