我们知道在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值。