2010-11-27 7 views
1

Erlang phashの正確な動作を別の言語(Rubyなど)で再現しようとしています。誰もその実装の詳細を知っていますか?基本的にはErlang Phashの実装

、Erlangであれば:私はRubyで phash(X,n) = Yことを望ん erlang:phash(X, n) -> Y

+0

まず、 'phash'にマッチさせる特定の要件がない限り、' phash2'をコピーしてください。しかし、より大きな問題は、phashとphash2がErlangの型システムのために特別に設計されていることです。両方の言語で同じハッシュを生成する正確なミラーを実装したいのですか、基本的なアイデアをコピーするだけですか?アーランのタイプのシステムは本質的に石に固定されているので、アイデアをコピーすることさえ難しいです。クラス、ユーザー定義型、情報隠蔽の概念はありません。 –

+0

残念ながら、コンポーネントのロードバランシングと 'phash'を使用するときに、ejabberdが使用する正確なパターンを再現する必要があるため、選択肢はあまりありません。 –

+0

あなたはこの問題で上り坂を進んでいます。おそらく、あなたはより高いレベルで達成しようとしていることを記述することができます。あなたが望むことをするための別の方法があるかもしれません。 –

答えて

2

、それがどのように動作するかを参照元のコードをチェックするには:https://github.com/erlang/otp/blob/cbd1378ee1fde835e55614bac9290b281bafe49a/erts/emulator/beam/utils.c#L644

をしかし、あなたは他の言語でphashの「正確な」行動を持つことはできません - あなたはそこに利用できるのerlangのデータ型を持っていないというだけの理由。 (あなた自身のマッピングを作成しない限り)

+0

同じマッピングを作成することはどれくらい難しいと思いますか? –

+0

私はそれが非常に非常に間違いやすいと思う。適切なハッシングのためにあなたのデータをerlangに送り返すためにhttp://www.igvita.com/2009/03/20/ruby-polyglot-talking-with-erlang/のようなものを使うとどう思いますか? – viraptor

+0

Hum。とにかくRubyでは実行されないため、Rubyでは本当に必要ありません。まったく同じマッピングをHAProxyに組み込むだけです。理想的には、私はCでそれを再作成する必要があります。Rubyは疑似コードを避けるためだけでした:) –