我们知道在riak_core中使用的是一致性哈希算法(关于该算法看我的日志:http://www.cnblogs.com/star-star/archive/2013/02/01/2888713.html

首先我们先看看riak_core_app:start/2启动时候的代码,可以看到设置默认的bucket属性。

%% add these defaults now to supplement the set that may have been
    %% configured in app.config
    riak_core_bucket:append_bucket_defaults(
      [{n_val,3},
       {allow_mult,false},
       {last_write_wins,false},
       {precommit, []},
       {postcommit, []},
       {chash_keyfun, {riak_core_util, chash_std_keyfun}}]),

可以看到chash_keyfun所注册的module是riak_core_util, function为chash_std_keyfun。

接下来,我们来查看一下散列使用的方法:

DocIdx = riak_core_util:chash_key({<<"ping">>, term_to_binary(now())}),

我们来看一下riak_core_util:chash_key的代码:

%% @spec chash_key(BKey :: riak_object:bkey()) -> chash:index()
%% @doc Create a binary used for determining replica placement.
chash_key({Bucket,Key}) ->
    BucketProps = riak_core_bucket:get_bucket(Bucket),
    {chash_keyfun, {M, F}} = proplists:lookup(chash_keyfun, BucketProps),
    M:F({Bucket,Key}).

%% @spec chash_std_keyfun(BKey :: riak_object:bkey()) -> chash:index()
%% @doc Default object/ring hashing fun, direct passthrough of bkey.
chash_std_keyfun({Bucket, Key}) -> chash:key_of({Bucket, Key}).

可以看到chash_key中,首先取得了bucket 的默认相关属性,从中找到chash_keyfun的配置,硬编码时,默认是riak_core_util:chash_std_keyfun/1,当然这里我们可以在app config文件中进行修改,

修改后的bucket 属性是覆盖掉硬编码的配置的。

 

chash_std_keyfun实际调用了chash:key_of/1

-spec key_of(ObjectName :: term()) -> index().
key_of(ObjectName) ->    
    crypto:sha(term_to_binary(ObjectName)).

可以看到默认调用的crypto:sha/1算法进行散列取得key值。

 

 

 

 

 posted on 2013-05-14 15:13  文武双全大星星  阅读(364)  评论(0编辑  收藏  举报