මම වෙනස් ඇල්ගොරිතම කිහිපයක් පරීක්ෂා කළෙමි, වේගය සහ ගැටුම් ගණන මැනීම.
මම වෙනස් යතුරු කට්ටල තුනක් භාවිතා කළෙමි:
එක් එක් මළකඳ සඳහා, isions ට්ටන ගණන සහ හැෂිං සඳහා ගත කළ සාමාන්ය කාලය සටහන් විය.
මම පරීක්ෂා කළා:
ප්රතිපල
සෑම ප්රති result ලයක්ම සාමාන්ය හැෂ් කාලය සහ isions ට්ටන ගණන අඩංගු වේ
Hash Lowercase Random UUID Numbers
============= ============= =========== ==============
Murmur 145 ns 259 ns 92 ns
6 collis 5 collis 0 collis
FNV-1a 152 ns 504 ns 86 ns
4 collis 4 collis 0 collis
FNV-1 184 ns 730 ns 92 ns
1 collis 5 collis 0 collis▪
DBJ2a 158 ns 443 ns 91 ns
5 collis 6 collis 0 collis▪▪▪
DJB2 156 ns 437 ns 93 ns
7 collis 6 collis 0 collis▪▪▪
SDBM 148 ns 484 ns 90 ns
4 collis 6 collis 0 collis**
SuperFastHash 164 ns 344 ns 118 ns
85 collis 4 collis 18742 collis
CRC32 250 ns 946 ns 130 ns
2 collis 0 collis 0 collis
LoseLose 338 ns - -
215178 collis
සටහන් :
Isions ට්ටන ඇත්ත වශයෙන්ම සිදු වේද?
ඔව්. හැෂ් isions ට්ටන ඇත්ත වශයෙන්ම සිදුවන්නේ දැයි බැලීමට මම මගේ පරීක්ෂණ වැඩසටහන ලිවීමට පටන් ගතිමි - එය හුදෙක් න්යායාත්මක ඉදිකිරීමක් නොවේ. ඒවා ඇත්ත වශයෙන්ම සිදු වේ:
FNV-1 isions ට්ටන
creamwove සමඟ ගැටේ quists
FNV-1a isions ට්ටන
costarring සමඟ ගැටේ liquid
declinate සමඟ ගැටේ macallums
altarage සමඟ ගැටේ zinke
altarages සමඟ ගැටේ zinkes
මැසිවිලි 2 ගැටීම
cataract සමඟ ගැටේ periti
roquette සමඟ ගැටේ skivie
shawl සමඟ ගැටේ stormbound
dowlases සමඟ ගැටේ tramontane
cricketings සමඟ ගැටේ twanger
longans සමඟ ගැටේ whigs
DJB2 isions ට්ටන
hetairas සමඟ ගැටේ mentioner
heliotropes සමඟ ගැටේ neurospora
depravement සමඟ ගැටේ serafins
stylist සමඟ ගැටේ subgenera
joyful සමඟ ගැටේ synaphea
redescribed සමඟ ගැටේ urites
dram සමඟ ගැටේ vivency
DJB2a isions ට්ටන
haggadot සමඟ ගැටේ loathsomenesses
adorablenesses සමඟ ගැටේ rentability
playwright සමඟ ගැටේ snush
playwrighting සමඟ ගැටේ snushing
treponematoses සමඟ ගැටේ waterbeds
CRC32 isions ට්ටන
codding සමඟ ගැටේ gnu
exhibiters සමඟ ගැටේ schlager
සුපර් ෆාස්ට් හැෂ් isions ට්ටන
dahabiah සමඟ ගැටේ drapability
encharm සමඟ ගැටේ enclave
grahams සමඟ ගැටේ gramary
- ... ගැටුම් 79 ක් ගිල දමන්න ...
night සමඟ ගැටේ vigil
nights සමඟ ගැටේ vigils
finks සමඟ ගැටේ vinic
සසම්භාවීකරණය
අනෙක් විෂයානුබද්ධ මිනුම වන්නේ හෑෂ් අහඹු ලෙස බෙදා හරින ආකාරයයි. එහි ප්රති ing ලයක් ලෙස හැෂ් ටේබල් සිතියම්ගත කිරීමෙන් දත්ත කෙතරම් ඒකාකාරව බෙදා හරිනවාද යන්න පෙන්වයි. රේඛාව රේඛීයව සිතියම්ගත කිරීමේදී සියලුම හැෂ් කාර්යයන් හොඳ බෙදාහැරීමක් පෙන්නුම් කරයි:

හෝ හිල්බට් සිතියමක් ලෙස ( XKCD සැමවිටම අදාළ වේ ):

අංකය නූල් hashing විට (හැර "1", "2", ..., "216553") (උදාහරණයක් ලෙස, ZIP කේත ), රටා hashing දක්නට නොමැත්තේ ඉතා මතු වීමට පටන් එහිදී:
SDBM :

DJB2a :

FNV-1 :

FNV-1a හැර අන් සියල්ලම මට තවමත් අහඹු ලෙස පෙනේ:

ඇත්ත වශයෙන්ම, මැසිවිලි 2Numbers ට වඩා හොඳ අහඹු බවක් ඇති බව පෙනේ FNV-1a:

මම දකින විට FNV-1a"අංකය" සිතියම, මම හිතන්නේ මම සියුම් සිරස් රටාවන් බලන්න. මැසිවිලි නඟන විට මට කිසිදු රටාවක් නොපෙනේ. ඔයා සිතන්නේ කුමක් ද?
*වගුවේ ඇති අමතර දේ අහඹු බව කෙතරම් නරකද යන්න දක්වයි. සමග FNV-1aහොඳම වීම, සහ DJB2xනරකම වීම:
Murmur2: .
FNV-1a: .
FNV-1: ▪
DJB2: ▪▪
DJB2a: ▪▪
SDBM: ▪▪▪
SuperFastHash: .
CRC: ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
Loselose: ▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
▪
▪▪▪▪▪▪▪▪▪▪▪▪▪
▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪
මම මුලින් මෙම වැඩසටහන ලිව්වේ ගැටුම් ගැන කරදර විය යුතුද යන්න තීරණය කිරීම සඳහා ය : මම එසේ කරමි.
ඉන්පසු එය හැෂ් ශ්රිත ප්රමාණවත් තරම් අහඹු ලෙස සිදු වන බවට වග බලා ගත්තේය.
FNV-1a ඇල්ගොරිතම
FNV1 හැෂ් 32, 64, 128, 256, 512 සහ 1024 බිට් හැෂ් ආපසු ලබා දෙන ප්රභේදයන්ගෙන් පැමිණේ.
මෙම FNV-1 අ ඇල්ගොරිතමය වේ:
hash = FNV_offset_basis
for each octetOfData to be hashed
hash = hash xor octetOfData
hash = hash * FNV_prime
return hash
නියතයන් FNV_offset_basisසහ FNV_primeඔබට අවශ්ය ආපසු හැෂ් ප්රමාණය මත රඳා පවතින තැන:
Hash Size
===========
32-bit
prime: 2^24 + 2^8 + 0x93 = 16777619
offset: 2166136261
64-bit
prime: 2^40 + 2^8 + 0xb3 = 1099511628211
offset: 14695981039346656037
128-bit
prime: 2^88 + 2^8 + 0x3b = 309485009821345068724781371
offset: 144066263297769815596495629667062367629
256-bit
prime: 2^168 + 2^8 + 0x63 = 374144419156711147060143317175368453031918731002211
offset: 100029257958052580907070968620625704837092796014241193945225284501741471925557
512-bit
prime: 2^344 + 2^8 + 0x57 = 35835915874844867368919076489095108449946327955754392558399825615420669938882575126094039892345713852759
offset: 9659303129496669498009435400716310466090418745672637896108374329434462657994582932197716438449813051892206539805784495328239340083876191928701583869517785
1024-bit
prime: 2^680 + 2^8 + 0x8d = 5016456510113118655434598811035278955030765345404790744303017523831112055108147451509157692220295382716162651878526895249385292291816524375083746691371804094271873160484737966720260389217684476157468082573
offset: 1419779506494762106872207064140321832088062279544193396087847491461758272325229673230371772250864096521202355549365628174669108571814760471015076148029755969804077320157692458563003215304957150157403644460363550505412711285966361610267868082893823963790439336411086884584107735010676915
වැඩි විස්තර සඳහා ප්රධාන FNV පිටුව බලන්න.
මගේ සියලු ප්රති results ල බිට් 32 ප්රභේදය සමඟ ඇත.
FNV-1a FNV-1a ට වඩා හොඳද?
FNV-1a වටේට වඩා හොඳයි. කෝපස් යන ඉංග්රීසි වචනය භාවිතා කරන විට FNV-1a සමඟ වැඩි ගැටුම් ඇති විය:
Hash Word Collisions
====== ===============
FNV-1 1
FNV-1a 4
දැන් කුඩා අකුරු සහ ලොකු අකුරු සංසන්දනය කරන්න:
Hash lowercase word Collisions UPPERCASE word collisions
====== ========================= =========================
FNV-1 1 9
FNV-1a 4 11
මෙම අවස්ථාවේ දී FNV-1a FN-1 ට වඩා "400%" නරක නැත , 20% ක් පමණක් නරක ය.
මම හිතන්නේ වඩා වැදගත් ගමනක් වන්නේ isions ට්ටන සම්බන්ධයෙන් ඇල්ගොරිතම පන්ති දෙකක් තිබීමයි:
- isions ට්ටන දුර්ලභ ය : FNV-1, FNV-1a, DJB2, DJB2a, SDBM
- isions ට්ටන පොදු : සුපර් ෆාස්ට් හැෂ්, ලොසෙලෝස්
එවිට හැෂ් කෙතරම් ඒකාකාරව බෙදා හරිනු ඇත්ද:
- කැපී පෙනෙන බෙදාහැරීම: මැසිවිලි 2, එෆ්එන්වී -1 ඒ, සුපර් ෆාස්ට්හස්
- විශිෂ්ට බෙදාහැරීම: FNV-1
- හොඳ බෙදාහැරීම: SDBM, DJB2, DJB2a
- භයානක බෙදාහැරීම: නැතිවීම
යාවත්කාලීන කරන්න
මැසිවිලි නඟනවාද? මොකද නැත්තේ අනිවාර්යෙන්ම
යාවත්කාලීන කරන්න
CRC32 ක්රියා කරන්නේ කෙසේදැයි ithshisname කල්පනා කර, මේසයට අංක එකතු කළේය.
CRC32 සෑහෙන්න හොඳයි . Isions ට්ටන ස්වල්පයක්, නමුත් මන්දගාමී වන අතර 1k බැලීමේ වගුවකට ඉහළින්.
CRC බෙදා හැරීම පිළිබඳ සියලු වැරදි දේ ඉවත් කරන්න - මගේ නරක
අද වන තුරු මම මගේ තථ්ය හැෂ්-මේස හැෂිං ඇල්ගොරිතම ලෙස FNV-1a භාවිතා කිරීමට ගියෙමි . නමුත් දැන් මම මැසිවිලි 2 වෙත මාරු වෙමි:
- ඉක්මනින්
- සියලුම පංති ආදාන වඩා හොඳ අහඹු ලෙස සකස් කිරීම
මට ඇත්තටම, ඇත්තටම සමග තියෙනවා යමක් වැරදි බලාපොරොත්තු වෙනවා SuperFastHashමට සොයා ඇල්ගොරිතමය ; එය තරම් ජනප්රිය වීම නරක ය.
යාවත්කාලීන කිරීම: සිට ගූගල් මත MurmurHash3 මුල්පිටුව :
(1) - සුපර් ෆාස්ට් හැෂ් ඉතා දුර්වල ision ට්ටන ගුණ ඇති අතර ඒවා වෙනත් තැනක ලේඛනගත කර ඇත.
ඒ නිසා මම හිතන්නේ එය මා පමණක් නොවේ.
යාවත්කාලීන කිරීම:Murmur අනෙක් ඒවාට වඩා වේගවත් වන්නේ මන්දැයි මම තේරුම් ගතිමි . MurmurHash2 වරකට බයිට් හතරක් මත ක්රියාත්මක වේ. බොහෝ ඇල්ගොරිතම බයිට් බයිට් වේ :
for each octet in Key
AddTheOctetToTheHash
මෙයින් අදහස් කරන්නේ යතුරු වැඩි වන විට මැසිවිලි නඟන්නට අවස්ථාව ලැබෙන බවයි.
යාවත්කාලීන කරන්න
රේමන්ඩ් චෙන් විසින් කරන ලද කාලෝචිත සටහනක් මගින් අවධාරණය කරනුයේ “අහඹු” GUIDs ඒවායේ අහඹු බව සඳහා භාවිතා කිරීමට අදහස් නොකරන බවයි. ඒවා හෝ ඒවායේ උප කුලකයක් හැෂ් යතුරක් ලෙස නුසුදුසු ය:
4 වන අනුවාදය GUID ඇල්ගොරිතම පවා අනපේක්ෂිත යැයි සහතික නොවේ, මන්ද ඇල්ගොරිතම සසම්භාවී සංඛ්යා උත්පාදක යන්ත්රයේ ගුණාත්මකභාවය නියම නොකරයි. GUID සඳහා වන විකිපීඩියා ලිපියේ මූලික පර්යේෂණ අඩංගු වන අතර එයින් ඇඟවෙන්නේ අහඹු සංඛ්යා උත්පාදක තත්ත්වය පිළිබඳ දැනුම මත පදනම්ව අනාගත සහ පෙර GUIDs පුරෝකථනය කළ හැකි බැවින් උත්පාදක යන්ත්රය ගුප්ත විද්යාත්මකව ශක්තිමත් නොවන බවයි.
අහඹු ලෙස ගැටීම වැළැක්වීම හා සමාන නොවේ; “අහඹු” මාර්ගෝපදේශයක යම් උපකොටසක් ගැනීමෙන් ඔබේම “හැෂිං” ඇල්ගොරිතම නිර්මාණය කිරීමට උත්සාහ කිරීම වැරැද්දක් වන්නේ එබැවිනි.
int HashKeyFromGuid(Guid type4uuid)
{
//A "4" is put somewhere in the GUID.
//I can't remember exactly where, but it doesn't matter for
//the illustrative purposes of this pseudocode
int guidVersion = ((type4uuid.D3 & 0x0f00) >> 8);
Assert(guidVersion == 4);
return (int)GetFirstFourBytesOfGuid(type4uuid);
}
සටහන : නැවතත්, මම "අහඹු GUID" උපුටා දැක්වීම් වලට දැමුවෙමි, මන්ද එය GUID වල "අහඹු" ප්රභේදයයි. වඩාත් නිවැරදි විස්තරයක් වනු ඇත Type 4 UUID. නමුත් 4 වන වර්ගය හෝ 1, 3 සහ 5 වර්ග මොනවාදැයි කිසිවෙකු දන්නේ නැත. එබැවින් ඒවා "අහඹු" GUID ලෙස හැඳින්වීම පහසුය.
සියලුම ඉංග්රීසි වචන දර්පණ