您使用什么模块或库来生成通用唯一标识符(UUID)?
hwamh0ep1#
对于像我这样的未来谷歌人来说,erlang-uuid from avtobiff的工作非常简单。
jaql4c8m2#
从http://github.com/travis/erlang-uuid开始
-module(uuid). -export([v4/0, to_string/1, get_parts/1]). -import(random). v4() -> v4(random:uniform(math:pow(2, 48)) - 1, random:uniform(math:pow(2, 12)) - 1, random:uniform(math:pow(2, 32)) - 1, random:uniform(math:pow(2, 30)) - 1). v4(R1, R2, R3, R4) -> <<R1:48, 4:4, R2:12, 2:2, R3:32, R4: 30>>. to_string(U) -> lists:flatten(io_lib:format("~8.16.0b-~4.16.0b-~4.16.0b-~2.16.0b~2.16.0b-~12.16.0b", get_parts(U))). get_parts(<<TL:32, TM:16, THV:16, CSR:8, CSL:8, N:48>>) -> [TL, TM, THV, CSR, CSL, N].
3pvhb19x3#
来自couchdb的UUID生成器:http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_uuids.erl
% 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(couch_uuids). -include("couch_db.hrl"). -behaviour(gen_server). -export([start/0, stop/0]). -export([new/0, random/0, utc_random/0]). -export([init/1, terminate/2, code_change/3]). -export([handle_call/3, handle_cast/2, handle_info/2]). start() -> gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). stop() -> gen_server:cast(?MODULE, stop). new() -> gen_server:call(?MODULE, create). random() -> list_to_binary(couch_util:to_hex(crypto:rand_bytes(16))). utc_random() -> Now = {_, _, Micro} = now(), Nowish = calendar:now_to_universal_time(Now), Nowsecs = calendar:datetime_to_gregorian_seconds(Nowish), Then = calendar:datetime_to_gregorian_seconds({{1970, 1, 1}, {0, 0, 0}}), Prefix = io_lib:format("~14.16.0b", [(Nowsecs - Then) * 1000000 + Micro]), list_to_binary(Prefix ++ couch_util:to_hex(crypto:rand_bytes(9))). init([]) -> ok = couch_config:register( fun("uuids", _) -> gen_server:cast(?MODULE, change) end ), {ok, state()}. terminate(_Reason, _State) -> ok. handle_call(create, _From, random) -> {reply, random(), random}; handle_call(create, _From, utc_random) -> {reply, utc_random(), utc_random}; handle_call(create, _From, {sequential, Pref, Seq}) -> Result = ?l2b(Pref ++ io_lib:format("~6.16.0b", [Seq])), case Seq >= 16#fff000 of true -> {reply, Result, {sequential, new_prefix(), inc()}}; _ -> {reply, Result, {sequential, Pref, Seq + inc()}} end. handle_cast(change, _State) -> {noreply, state()}; handle_cast(stop, State) -> {stop, normal, State}; handle_cast(_Msg, State) -> {noreply, State}. handle_info(_Info, State) -> {noreply, State}. code_change(_OldVsn, State, _Extra) -> {ok, State}. new_prefix() -> couch_util:to_hex((crypto:rand_bytes(13))). inc() -> crypto:rand_uniform(1, 16#ffe). state() -> AlgoStr = couch_config:get("uuids", "algorithm", "random"), case couch_util:to_existing_atom(AlgoStr) of random -> random; utc_random -> utc_random; sequential -> {sequential, new_prefix(), inc()}; Unknown -> throw({unknown_uuid_algorithm, Unknown}) end.
k5hmc34c4#
我建议对支持https://github.com/yrashk/erlang-ossp-uuid的Erlang使用ossp-uuid nif绑定
ossp_uuid:make(v4, text)
llmtgqce5#
为什么使用round(math:pow(2, 48))?我认为1 bsl 48会更快地工作,代码也不会失去理解。
round(math:pow(2, 48))
1 bsl 48
dfty9e196#
试试这个:https://github.com/afiskon/erlang-uuid-v4有史以来最简单的实现。
cx6n0qe37#
如果您不需要遵循RFC 4122,则可以使用now/0调用生成唯一ID,而无需外部依赖关系,因为now调用生成元组在VM内部绝对唯一,并且在节点之间很可能唯一
now/0
qlzsbp2j8#
这一条:程式库:https://gitlab.com/zxq9/zuuid文件:http://zxq9.com/projects/zuuid/docs/据我所知,这是Erlang中唯一完整的RFC-4122 UUID实现,其中包含v1、v2、v3、v4、v5,“v6”建议被实现为“vVI”,以及用于NFC、Microsoft、和文档的一个例子--基于我收到的无数建议,这些建议都来自于我是说Erlang名单上的人。附言:* 非常 * 感谢二郎山的那些了不起的人,他们花时间对我的每一件事都进行了精确的分析。自由党对此要好得多。
smdnsysy9#
This code generate V4 UUID code
-module(uuid). -export([uuid_v4/0]). -define(VARIANT10, 2#10). -define(UUIDv4, 4). uuid_v4() -> <<U0:32, U1:16, _:4, U2:12, _:2, U3:30, U4:32>> = crypto:strong_rand_bytes(16), lists:flatten(io_lib:format("~8.16.0b-~4.16.0b-~4.16.0b-~2.16.0b~2.16.0b-~12.16.0b",get_binary_uuid(<<U0:32, U1:16, ?UUIDv4:4, U2:12, ?VARIANT10:2, U3:30, U4:32>>))). get_binary_uuid(<<TL:32, TM:16, THV:16, CSR:8, CSL:8, N:48>>) -> [TL, TM, THV, CSR, CSL, N].
For compile run : c(uuid).For run code : uuid:uuid_v4().
9条答案
按热度按时间hwamh0ep1#
对于像我这样的未来谷歌人来说,erlang-uuid from avtobiff的工作非常简单。
jaql4c8m2#
从http://github.com/travis/erlang-uuid开始
3pvhb19x3#
来自couchdb的UUID生成器:http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_uuids.erl
k5hmc34c4#
我建议对支持https://github.com/yrashk/erlang-ossp-uuid的Erlang使用ossp-uuid nif绑定
llmtgqce5#
为什么使用
round(math:pow(2, 48))
?我认为1 bsl 48
会更快地工作,代码也不会失去理解。dfty9e196#
试试这个:https://github.com/afiskon/erlang-uuid-v4有史以来最简单的实现。
cx6n0qe37#
如果您不需要遵循RFC 4122,则可以使用
now/0
调用生成唯一ID,而无需外部依赖关系,因为now调用生成元组在VM内部绝对唯一,并且在节点之间很可能唯一qlzsbp2j8#
这一条:
程式库:https://gitlab.com/zxq9/zuuid
文件:http://zxq9.com/projects/zuuid/docs/
据我所知,这是Erlang中唯一完整的RFC-4122 UUID实现,其中包含v1、v2、v3、v4、v5,“v6”建议被实现为“vVI”,以及用于NFC、Microsoft、和文档的一个例子--基于我收到的无数建议,这些建议都来自于我是说Erlang名单上的人。
附言:* 非常 * 感谢二郎山的那些了不起的人,他们花时间对我的每一件事都进行了精确的分析。自由党对此要好得多。
smdnsysy9#
This code generate V4 UUID code
For compile run : c(uuid).
For run code : uuid:uuid_v4().