2

次の結果を得ることができる多言語ライブラリまたは何かがあるかどうかを知りたいです。

  • 私は Java で String = "Abcde12345" を持っています
  • Java でのハッシュコードは「78911」であるとします。
  • CプログラムにString = "Abcde12345"があります

私が知りたいのは、C プログラムでハッシュコード 78911 を簡単に取得するにはどうすればよいかということです。各言語は文字列に対して独自のハッシュ アルゴリズムを提供できるため、どのように処理できますか?


分散ハッシュ テーブル (データグリッド、分散キャッシュ、NoSQL...) を使用するコンテキストでこれを求めています。Java 独自のデータグリッド用に、C で非常に単純なクライアントに似たものを作成することを計画しています。

これは今のところ私のユースケースですが、私のプロジェクトでは、複数の言語と互換性のあるハッシュ アルゴリズムが必要になります。 - Ruby の Java ハッシュ アルゴリズム - Java の C# ハッシュ アルゴリズム - Java の C++ ハッシュ アルゴリズム - C++ の Java ハッシュ アルゴリズム - Java ハッシュアーランのアルゴリズム いずれにせよ、両方の言語の両方のアルゴリズムのハッシュは、まったく同じハッシュ値を生成する必要があります。

可能であれば、文字列だけでなく、プリミティブ型と「単純な構造」にも概念を拡張したいと思います


私のユースケースを処理するためのツールを知っている人はいますか?


編集:ジム・バルターのために

私のユースケースは次のとおりです。

私は Java で書かれた、GemFire と呼ばれる独自のパーティショニング/データグリッド テクノロジを持っています。分散ハッシュマップとして機能します。ハッシュマップのバケット数は固定されています。マップキーごとにハッシュコードを計算し、モジュロを適用して、各キーが属する各バケットを認識します。

たとえば、113 個のバケット (gemfire のデフォルトのバケット数) があり、マップ キーが文字列 "Key" である場合

"Key".hashCode() % 113 = 69

したがって、GemFire は「キー」が 69 番目のバケットに属していることを認識します。

今、私はCアプリケーションを持っています:

  • このアプリケーションは、Gemfire が使用するバケットの数 (113) を既に認識しています。
  • このアプリケーションは、任意のランダム キーについて、GemFire がそのランダム キーを配置するバケット番号を計算できる必要があります。
  • このアプリケーションは、高速に計算できる必要があります。Web サービスは使用できません。
  • このアプリケーションは簡単にデプロイできる必要があり、C アプリケーションを実行するために JVM をインストールする必要がある C/Java 間のブリッジ技術はありません。

したがって、C で Java ハッシュコード ポートを記述/使用せずにそれを行う方法を知っている場合は、教えてください。

編集:混乱を避けるために:私は他に何かを探しているわけではありませんが、ジム・バルターは、私が必要としていると主張するものは必要ないと提案したので、カスタムハッシュまたはポピュラーハッシュを使用する以外の他の解決策があれば教えてくださいアルゴリズム。

そして将来的には、Erlang のパーティショニング アプリケーションと C# クライアント アプリケーション、および他の言語に対しても同じことを行う必要があるかもしれません!


編集: Java以外のハッシュアルゴリズムの使用を避けたいと思います(誰かがmd5/sha1またはより高速な非セキュリティ指向のハッシュアルゴリズムを使用することを提案したように)。これは、私のソリューションが、多くの場合 Java で記述された従来の分散システムにデプロイすることを目的としており、このシステムにはすでに大量のデータが含まれており、ハッシュ アルゴリズムを変更すると、データの移行プロセスが大幅に必要になるためです。ただし、このソリューションは、新しい分散システムをゼロから開始するか、データ移行を行う準備ができている人にとっては、2 番目の良い選択肢になる可能性があるため、心に留めておきます。


結局のところ、私が探しているのは、Java String ハッシュ アルゴリズムを C で実装するように言う人ではありません。CですべてのプリミティブなJavaアルゴリズムを実装するだけでなく、他の言語でも、他の言語からでも、誰かがすでにそれを行っているかどうかを知りたいです!!! ハッシュアルゴリズムのポートである、他の言語ごとに提供する多言語ライブラリを探しています。

したがって、地球上に 3 つの言語 (C、Java、および Python) しかない場合、私の質問は次のことを提供する多言語ライブラリはありますか?

  • C での Java ハッシュのポート
  • Python での Java ハッシュのポート
  • Java での C ハッシュのポート
  • Python での C ハッシュのポート
  • Java での Python ハッシュのポート
  • C での Python ハッシュのポート

利用可能なすべてのプリミティブ型、および最終的には基本構造。特定の言語に「デフォルトのハッシュアルゴリズム」がない場合、最も広く使用されているものを言語アルゴリズムと見なすことができます。

私が何を意味するか分かりますか?LIBRARYがあるか知りたい!JDKまたは仕様を調べて自分で実装できることは知っていますが、多数の言語をターゲットにしており、すべての言語でコーディングする方法がわからないため、誰かにやってもらいたいです私のために、オープンソースで利用可能になり、プロジェクトを自由に使用できます!

4

2 に答える 2

1

OpenJDK のソース コードを参照して、hashCode の実装を確認できることを付け加えておきます。ただし、ジム・ギャリソンが提案したコメントで示唆されているように、さまざまなクラスが hashCode をオーバーライドする可能性があるため、実装に従う必要があることに注意してください。文字列のハッシュを実行して、 sha-1 や md5 などのよく知られたハッシュ関数を使用することをお勧めします。 Java 、 C/C++ 、およびその他のプログラミング言語の両方で実装を見つけることができます。

于 2012-06-19T17:15:20.977 に答える
0

Java 文字列のハッシュ コードを計算するアルゴリズムは非常に単純で、公開仕様の一部として文書化されています: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String。 html#ハッシュコード()

String オブジェクトのハッシュ コードは、s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] として計算されます。

int 演算を使用します。ここで、s[i] は文字列の i 番目の文字、n は文字列の長さ、^ はべき乗を示します。(空の文字列のハッシュ値はゼロです。)

String は final クラスであるため、そのメソッドをオーバーライドできないことにも注意してください。したがって、特定のアルゴリズムがどの Java String に対しても正しいことが保証されます。

Java 以外の言語の場合、その言語でハッシュ アルゴリズムが指定されていない場合 (そして Java はそうするのが一般的ではありません)、たとえそれを確認できたとしても、ハッシュ アルゴリズムが変更されないことを確認することはできません。あなたが必要だと主張するものは実際には必要ではないと思いますが、あなたの要件についてもっと言わなければならないでしょう (あなたがそれらに対処すると思うものとは対照的に)。

于 2012-06-19T17:31:58.097 に答える