日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Google Guava] 10-散列

發(fā)布時(shí)間:2025/3/21 编程问答 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Google Guava] 10-散列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文鏈接?譯文鏈接?譯者:沈義揚(yáng)

概述

Java內(nèi)建的散列碼[hash code]概念被限制為32位,并且沒有分離散列算法和它們所作用的數(shù)據(jù),因此很難用備選算法進(jìn)行替換。此外,使用Java內(nèi)建方法實(shí)現(xiàn)的散列碼通常是劣質(zhì)的,部分是因?yàn)樗鼈冏罱K都依賴于JDK類中已有的劣質(zhì)散列碼。

Object.hashCode往往很快,但是在預(yù)防碰撞上卻很弱,也沒有對分散性的預(yù)期。這使得它們很適合在散列表中運(yùn)用,因?yàn)轭~外碰撞只會帶來輕微的性能損失,同時(shí)差勁的分散性也可以容易地通過再散列來糾正(Java中所有合理的散列表都用了再散列方法)。然而,在簡單散列表以外的散列運(yùn)用中,Object.hashCode幾乎總是達(dá)不到要求——因此,有了com.google.common.hash包。

散列包的組成

在這個(gè)包的Java doc中,我們可以看到很多不同的類,但是文檔中沒有明顯地表明它們是怎樣 一起配合工作的。在介紹散列包中的類之前,讓我們先來看下面這段代碼范例:

1HashFunction hf = Hashing.md5();
2HashCode hc = hf.newHasher()
3????????.putLong(id)
4????????.putString(name, Charsets.UTF_8)
5????????.putObject(person, personFunnel)
6????????.hash();

HashFunction

HashFunction是一個(gè)單純的(引用透明的)、無狀態(tài)的方法,它把任意的數(shù)據(jù)塊映射到固定數(shù)目的位指,并且保證相同的輸入一定產(chǎn)生相同的輸出,不同的輸入盡可能產(chǎn)生不同的輸出。

Hasher

HashFunction的實(shí)例可以提供有狀態(tài)的Hasher,Hasher提供了流暢的語法把數(shù)據(jù)添加到散列運(yùn)算,然后獲取散列值。Hasher可以接受所有原生類型、字節(jié)數(shù)組、字節(jié)數(shù)組的片段、字符序列、特定字符集的字符序列等等,或者任何給定了Funnel實(shí)現(xiàn)的對象。

Hasher實(shí)現(xiàn)了PrimitiveSink接口,這個(gè)接口為接受原生類型流的對象定義了fluent風(fēng)格的API

Funnel

Funnel描述了如何把一個(gè)具體的對象類型分解為原生字段值,從而寫入PrimitiveSink。比如,如果我們有這樣一個(gè)類:

1class?Person {
2????final?int?id;
3????final?String firstName;
4????final?String lastName;
5????final?int?birthYear;
6}

它對應(yīng)的Funnel實(shí)現(xiàn)可能是:

01Funnel<Person> personFunnel =?new?Funnel<Person>() {
02????@Override
03????public?void?funnel(Person person, PrimitiveSink into) {
04????????into
05????????????.putInt(person.id)
06????????????.putString(person.firstName, Charsets.UTF_8)
07????????????.putString(person.lastName, Charsets.UTF_8)
08????????????.putInt(birthYear);
09????}
10}

注:putString(“abc”, Charsets.UTF_8).putString(“def”, Charsets.UTF_8)完全等同于putString(“ab”, Charsets.UTF_8).putString(“cdef”, Charsets.UTF_8),因?yàn)樗鼈兲峁┝讼嗤淖止?jié)序列。這可能帶來預(yù)料之外的散列沖突。增加某種形式的分隔符有助于消除散列沖突。

HashCode

一旦Hasher被賦予了所有輸入,就可以通過hash()方法獲取HashCode實(shí)例(多次調(diào)用hash()方法的結(jié)果是不確定的)。HashCode可以通過asInt()、asLong()、asBytes()方法來做相等性檢測,此外,writeBytesTo(array, offset, maxLength)把散列值的前maxLength字節(jié)寫入字節(jié)數(shù)組。

布魯姆過濾器[BloomFilter]

布魯姆過濾器是哈希運(yùn)算的一項(xiàng)優(yōu)雅運(yùn)用,它可以簡單地基于Object.hashCode()實(shí)現(xiàn)。簡而言之,布魯姆過濾器是一種概率數(shù)據(jù)結(jié)構(gòu),它允許你檢測某個(gè)對象是一定不在過濾器中,還是可能已經(jīng)添加到過濾器了。布魯姆過濾器的維基頁面對此作了全面的介紹,同時(shí)我們推薦github中的一個(gè)教程。

Guava散列包有一個(gè)內(nèi)建的布魯姆過濾器實(shí)現(xiàn),你只要提供Funnel就可以使用它。你可以使用create(Funnel funnel, int expectedInsertions, double falsePositiveProbability)方法獲取BloomFilter<T>,缺省誤檢率[falsePositiveProbability]為3%。BloomFilter<T>提供了boolean mightContain(T)?和void put(T),它們的含義都不言自明了。

01BloomFilter<Person> friends = BloomFilter.create(personFunnel,?500,?0.01);
02for(Person friend : friendsList) {
03????friends.put(friend);
04}
05?
06// 很久以后
07if?(friends.mightContain(dude)) {
08????//dude不是朋友還運(yùn)行到這里的概率為1%
09????//在這兒,我們可以在做進(jìn)一步精確檢查的同時(shí)觸發(fā)一些異步加載
10}

Hashing類

Hashing類提供了若干散列函數(shù),以及運(yùn)算HashCode對象的工具方法。

已提供的散列函數(shù)

md5()murmur3_128()murmur3_32()sha1()
sha256()sha512()goodFastHash(int bits)?

HashCode運(yùn)算

方法描述
HashCode?combineOrdered( Iterable<HashCode>)以有序方式聯(lián)接散列碼,如果兩個(gè)散列集合用該方法聯(lián)接出的散列碼相同,那么散列集合的元素可能是順序相等的
HashCode ? combineUnordered( Iterable<HashCode>)以無序方式聯(lián)接散列碼,如果兩個(gè)散列集合用該方法聯(lián)接出的散列碼相同,那么散列集合的元素可能在某種排序下是相等的
int ? consistentHash( HashCode, int buckets)為給定的”桶”大小返回一致性哈希值。當(dāng)”桶”增長時(shí),該方法保證最小程度的一致性哈希值變化。詳見一致性哈希。

原創(chuàng)文章,轉(zhuǎn)載請注明:?轉(zhuǎn)載自并發(fā)編程網(wǎng) – ifeve.com本文鏈接地址:?[Google Guava] 10-散列

from:?http://ifeve.com/google-guava-hashing/?

總結(jié)

以上是生活随笔為你收集整理的[Google Guava] 10-散列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲乱码中文字幕 | 老熟妇一区二区三区啪啪 | 天天爽天天操 | 国产中文在线视频 | 国产日产欧美一区二区 | av电影在线观看 | 男人日女人b视频 | 免费日韩精品 | 无码无套少妇毛多18pxxxx | 国产精品成av人在线视午夜片 | 丝袜熟女一区二区三区 | 午夜不卡福利 | 欧美在线视频你懂的 | 亚洲欧美日韩精品在线 | 天堂新版8中文在线8 | 黄色小视频免费网站 | 欧美三级韩国三级日本三斤在线观看 | 国产色一区二区 | 黄色片视频免费 | 一级欧美在线 | 久久久亚洲天堂 | 久久夜色精品国产欧美乱极品 | 最新黄网 | 波多野结衣一区二区三区中文字幕 | 国产高清一二三区 | 欧美四区 | 亚洲电影影音先锋 | 五月婷婷一区二区 | 国产婷婷色一区二区三区在线 | av图片在线观看 | 亚洲在线观看av | 国产调教打屁股xxxx网站 | 91色啪| 7777久久亚洲中文字幕 | 奇米精品一区二区三区四区 | 蜜桃在线一区 | 六月丁香婷婷网 | 国产wwwwwww | 国产精品色婷婷99久久精品 | 国产成人精品亚洲日本在线观看 | 亚洲国产精品女人久久久 | 国产成人精品一区二三区 | 中国在线观看片免费 | 偷偷操视频| 欧美高清另类 | 在线一级片 | 伊人久久国产精品 | 蜜桃一区二区三区 | 奇米亚洲| 国产资源免费 | 午夜视频网站在线观看 | 爽爽影院免费观看 | 国产黄色网 | 日本不卡一区二区在线观看 | 成人爽a毛片一区二区免费 日本高清免费看 | 欧美一区二区高清 | 精品二区在线观看 | 在线不卡免费视频 | 日本在线色 | 国产午夜三级 | 亚洲经典一区 | av黄色免费网站 | 国产精品一区在线看 | 在线观看午夜视频 | 污视频网站免费在线观看 | 日本成人在线播放 | 欧美成人三级伦在线观看 | 主播一区二区 | 久久三 | 亚洲一区图片 | 朋友人妻少妇精品系列 | 中文无码熟妇人妻av在线 | 饥渴少妇勾引水电工av | 免费在线观看av网址 | 自拍偷拍p| 久久久久久夜 | 无码人妻久久一区二区三区 | 亚洲乱淫 | 欧美成人精品二区三区99精品 | 91精品久久久久久粉嫩 | av小说在线观看 | 亚洲精选久久 | 成人国产一区二区三区精品麻豆 | 亚洲一区二区三区不卡视频 | 成人app在线 | 日韩av免费在线看 | 污污视频网站在线免费观看 | 国产日韩欧美视频在线 | 17c一起操| 久久久www免费人成人片 | 爱福利视频一区 | 最新久久 | 99国产精品免费 | 在线观看黄色片 | 青草在线视频 | 精品熟妇无码av免费久久 | 欧美一本在线 | 777欧美| 男女精品视频 |