[erlang-questions] GUID

Caoyuan <>
Thu Oct 25 17:24:50 CEST 2007


I have piece of code, but with no function to read the MAC address of
the local machine interfaces:


-define(NUM_CHR_UPPER,
{$0,$1,$2,$3,$4,$5,$6,$7,$8,$9,$A,$B,$C,$D,$E,$F,$G,$H,$I,$J,$K,$L,$M,$N,$O,$P,$Q,$R,$S,$T,$U,$V,$W,$X,$Y,$Z}).
-define(NUM_CHR_LOWER,
{$0,$1,$2,$3,$4,$5,$6,$7,$8,$9,$a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n,$o,$p,$q,$r,$s,$t,$u,$v,$w,$x,$y,$z}).


number_to_based_str(Number, Base) -> number_to_based_str(Number, Base, []).
number_to_based_str(Number, Base, Digits) when is_integer(Digits) ->
    Str = number_to_based_str(Number, Base, []),
    case Digits - length(Str) of
        Rem when Rem > 0 -> lists:duplicate(Rem, $0) ++ Str;
        _                -> Str
    end;
number_to_based_str(Number, Base, _Acc) when Number < Base ->
    [element(Number + 1, ?NUM_CHR_LOWER)];
number_to_based_str(Number, Base,  Acc) ->
    Msd = Number div Base,
    Lsd = Number rem Base,
    case Msd >= Base of
        true  -> number_to_based_str(Msd, Base, [element(Lsd + 1,
?NUM_CHR_LOWER)|Acc]);
        false -> [element(Msd + 1, ?NUM_CHR_LOWER)|[element(Lsd + 1,
?NUM_CHR_LOWER)|Acc]]
    end.

%% @doc Generates a GUID per http://www.ietf.org/rfc/rfc4122.txt
(version 1 generator)
gen_guid() ->
    TimeIn100NanosBeg = calendar:datetime_to_gregorian_seconds({{1582,
10, 15}, {0, 0, 0}}) * 10000000,
    {_MegaSecs, _Secs, MicroSecs} = now(),
    TimeIn100NanosNow =
calendar:datetime_to_gregorian_seconds(calendar:universal_time()) *
10000000 + MicroSecs * 10,
    Time = TimeIn100NanosNow - TimeIn100NanosBeg,
    TimeStr = number_to_based_str(Time, 16, 2),
    TimeStr1 =
      case 15 - length(TimeStr) of
          Rem when Rem > 0 -> lists:duplicate(Rem, $0) ++ TimeStr;
          _                -> TimeStr
      end,
    TimeHiV = lists:sublist(TimeStr1, 1, 3) ++ "1", %% add version number 1,
    TimeMid = lists:sublist(TimeStr1, 4, 4),
    TimeLow = lists:sublist(TimeStr1, 8, 8),
    ClockSeqHiV = io_format("~2.16.0b", [(random:uniform(256) - 1)
band 16#3f bor 16#80]), %% multiplexed variant type (2 bits)
    ClockSeqLow = io_format("~2.16.0b", [(random:uniform(256) - 1)]),
    Node = "001b631ee26b", %% an Ethernet MAC
    TimeLow ++ "-" ++ TimeMid ++ "-" ++ TimeHiV ++ "-" ++ ClockSeqHiV
++ ClockSeqLow ++ "-" ++ Node.

%% @doc Generates a random GUID per
http://www.ietf.org/rfc/rfc4122.txt (version 4 generator)
%% e.g. output: 372472a2-d557-4630-bc7d-bae54c934da1
%% word*2-, word-, (w)ord-, (w)ord-, word*3
gen_guid_v4() ->
    lists:foldl(
      fun (I, Acc) ->
              B = random:uniform(256) - 1, %% return random number
between 0, 255
              S = if  I == 7 -> %% multiplex version number (4 bits)
                          B1 = B band 16#0f bor 16#40, %% version 4 (random)
                          %% The last 0 in 2.16.0 means fill with
leading 0 if necessay
                          io_format("~2.16.0b", [B1]);
                      I == 9 -> %% multiplexed variant type (2 bits)
                          B1 = B band 16#3f bor 16#80,
                          io_format("~2.16.0b", [B1]);
                      I == 4; I == 6; I == 8; I == 10 ->
                          io_format("~2.16.0b-", [B]);
                      true ->
                          io_format("~2.16.0b", [B])
                  end,
              Acc ++ S
      end, [], lists:seq(1, 16)).

On 10/25/07, Joe Armstrong <> wrote:
> Does anybody have some Erlang code to generate a GUID?
> (or to read the MAC address of the local machine interfaces?)
>
> Thanks
>
> /Joe
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions
>


-- 
- Caoyuan



More information about the erlang-questions mailing list