ハッシュ (Hash) はハッシュとも呼ばれ、非常に一般的なアルゴリズムです。ハッシュは主にJavaのHashMapデータ構造で使用されます。ハッシュ アルゴリズムには、ハッシュ関数とハッシュ テーブルの 2 つの部分が含まれます。配列の特性は添字 (O(1)) を通じて簡単に見つけることができます。同様に、ハッシュ テーブルでは、キー (ハッシュ値) を通じて特定の値を素早く見つけることができます。ハッシュ値はハッシュ関数(ハッシュ(キー) = アドレス)によって計算されます。要素 [address] = value は、ハッシュ値を通じて見つけることができます。原理は配列の原理と似ています。
最適なハッシュ関数は、もちろん、keyの値ごとに一意のハッシュ値を計算できるものですが、異なるkeyの値のハッシュ値が存在することがよくあり、それが競合を引き起こす可能性があります。ハッシュ関数が適切に設計されているかどうかを判断するには:
1. 競合が少ない。
2. 計算が速い。
一般的に使用されるハッシュ関数のいくつかを以下に示します。それらはすべて特定の数学的原理を背景にしていますが、ここではその数学的原理については説明しません。
BKDRハッシュ関数(h = 31 * h + c)
このハッシュ関数は、Javaにおける文字列のハッシュ値計算に適用されます。
//String#hashCodepublic int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i
DJB2 ハッシュ関数 (h = h ) ElasticSearch ただDJB2
ハッシュ関数を使用して、インデックスを作成するドキュメントの指定されたkeyをハッシュします。 SDBMハッシュ関数(
h = h SDBM (簡易データベースエンジン))を使用します。 上記は 3 つのハッシュ関数をリストしただけです。それらの競合がどのように見えるかを実験してみましょう。 Java
1 package com.algorithm.hash; 2 3 import java.util.HashMap; 4 import java.util.UUID; 5 6 /** 7 * 三种哈希函数冲突数比较 8 * Created by yulinfeng on 6/27/17. 9 */10 public class HashFunc {11 12 public static void main(String[] args) {13 int length = 1000000; //100万字符串14 //利用HashMap来计算冲突数,HashMap的键值不能重复所以length - map.size()即为冲突数15 HashMap<string> bkdrMap = new HashMap<string>();16 HashMap<string> djb2Map = new HashMap<string>();17 HashMap<string> sdbmMap = new HashMap<string>();18 getStr(length, bkdrMap, djb2Map, sdbmMap);19 System.out.println("BKDR哈希函数100万字符串的冲突数:" + (length - bkdrMap.size()));20 System.out.println("DJB2哈希函数100万字符串的冲突数:" + (length - djb2Map.size()));21 System.out.println("SDBM哈希函数100万字符串的冲突数:" + (length - sdbmMap.size()));22 }23 24 /**25 * 生成字符串,并计算冲突数26 * @param length27 * @param bkdrMap28 * @param djb2Map29 * @param sdbmMap30 */31 private static void getStr(int length, HashMap<string> bkdrMap, HashMap<string> djb2Map, HashMap<string> sdbmMap) {32 for (int i = 0; i <span style="font-family: SimSun;"></span> 以下は、10<p></p>million、<p><strong>100<span style="font-size: 18px;"></span>million、</strong></p>200<div class="cnblogs_code"></div>millionの競合数です。 <p><span style="font-family: Calibri;"></span><span style="font-family: SimSun;"></span><span style="font-family: Calibri;"></span><span style="font-family: SimSun;"></span><span style="font-family: Calibri;"></span> <span style="font-family: SimSun;"> </span></p> 試行を重ねると、実際には 3 つのハッシュ関数の衝突回数はほぼ同じになりました。 <p><span style="font-family: SimSun;"> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/001/6d0143f1fa951707d245c36e169c2fd5-0.png?x-oss-process=image/resize,p_40" class="lazy" alt=""></span>Python</p> <p>3<img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/001/6d0143f1fa951707d245c36e169c2fd5-1.png?x-oss-process=image/resize,p_40" class="lazy" alt=""></p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/001/6d0143f1fa951707d245c36e169c2fd5-2.png?x-oss-process=image/resize,p_40" class="lazy" alt=""></p> <pre class="brush:php;toolbar:false"> 1 import uuid 2 3 def hash_test(length, bkdrDic, djb2Dic, sdbmDic): 4 for i in range(length): 5 string = str(uuid.uuid1()) #基于时间戳 6 bkdrDic[bkdr(string)] = string 7 djb2Dic[djb2(string)] = string 8 sdbmDic[sdbm(string)] = string 9 10 #BDKR哈希函数11 def bkdr(string):12 hash = 013 for i in range(len(string)):14 hash = 31 * hash + ord(string[i]) # h = 31 * h + c15 return hash16 17 #DJB2哈希函数18 def djb2(string):19 hash = 020 for i in range(len(string)):21 hash = 33 * hash + ord(string[i]) # h = h <p> ハッシュテーブルは、クイック検索用のインデックスを作成するためにハッシュ関数とともに使用する必要があるデータ構造です<span style="font-family: Calibri;">——</span><span style="font-family: SimSun;">「アルゴリズムノート」。一般的に言えば、これは固定長の記憶域です。たとえば、</span><span style="font-family: Calibri;">HashMap</span><span style="font-family: SimSun;">のデフォルトのハッシュテーブルは、</span><span style="font-family: Calibri;">16</span><span style="font-family: SimSun;">の固定長の</span><span style="font-family: Calibri;">Entry</span><span style="font-family: SimSun;">配列です。固定長の記憶域を確保した後、残りの問題は、値をどの位置に配置するかです。通常、ハッシュ値が </span><span style="font-family: Calibri;">m</span><span style="font-family: SimSun;"> で、長さが </span><span style="font-family: Calibri;">n</span><span style="font-family: SimSun;"> の場合、値は に配置されます。 </span><span style="font-family: Calibri;"> m mod n</span><span style="font-family: SimSun;"> の位置。 </span></p><p> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/001/6d0143f1fa951707d245c36e169c2fd5-3.png?x-oss-process=image/resize,p_40" class="lazy" alt=""></p><p> 上の図は、ハッシュとハッシュ テーブル、および競合の解決策 (ジッパー メソッド) を示しています。競合を解決するには、競合がなくなるまで再度ハッシュする方法や、上図に示すように、ジッパー方式を使用してリンク リストを使用して同じ位置の要素を連結する方法など、さまざまな方法があります。 </p><p> 上記の例のハッシュ テーブルの長さが <span style="max-width:90%">10</span><span style="font-family: SimSun;"> で、</span><span style="font-family: Calibri;">1</span><span style="font-family: SimSun;"> の競合が発生すると想像してください。ハッシュ テーブルの長さが </span><span style="font-family: Calibri;">20</span><span style="font-family: SimSun;"> の場合、競合は発生しません。検索は高速になりますが、ハッシュ テーブルの長さが </span><span style="font-family: Calibri;">2</span><span style="font-family: SimSun;"> 回の場合、競合検索は遅くなりますが、多くのスペースを節約できます。空間。 </span>したがって、ハッシュ テーブルの長さの選択は非常に重要ですが、同時に重要な問題でもあります。 <span style="font-family: Calibri;"></span><span style="font-family: SimSun;"><strong></strong>補足:</span></p><p><em>ハッシュは、異なる値が異なるハッシュ値を持つなど、さまざまな場面で使用されますが、ハッシュアルゴリズムは、類似または同一の値を類似または類似させるように絶妙に設計することもできます。ハッシュ値は同じです。つまり、2 つのオブジェクトが完全に異なる場合、それらのハッシュ値は完全に異なります。2 つのオブジェクトがまったく同じである場合、それらのハッシュ値もまったく同じになります。それらのハッシュ値も完全に異なります。これは実際には類似性の問題です。つまり、この考え方は一般化して類似性の計算 (Jaccard 距離問題など) に適用でき、最終的には正確な広告の掲載や製品の推奨などに適用できます。 </em></p><p><em> さらに、コンシステントハッシュは負荷分散にも適用でき、各サーバーが負荷圧力を均等に共有できるようにする方法として、優れたハッシュアルゴリズムを使用することもできます。 </em></p>
以上がハッシュ -- 一般的なアルゴリズムの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター
