MurmurHash - MurmurHash - Wikipedia

MurmurHash emaskriptografik xash funktsiyasi umumiy xashga asoslangan qidirish uchun mos.[1] U Ostin Appleby tomonidan 2008 yilda yaratilgan[2] va hozirda "SMHasher" nomli sinov to'plami bilan birga GitHub-da joylashgan. Shuningdek, u bir qator variantlarda mavjud,[3] bularning barchasi jamoat mulki bo'lgan. Ism ichki siklida ishlatiladigan (MU) va rotatsion (R) ikkita asosiy operatsiyadan kelib chiqadi.

Aksincha kriptografik xash funktsiyalari, uni dushman tomonidan qaytarib olish qiyin bo'lishi uchun maxsus ishlab chiqilmagan, shuning uchun uni kriptografik maqsadlar uchun yaroqsiz holga keltiradi.

Variantlar

MurmurHash3

Amaldagi versiyasi MurmurHash3,[4][5] bu 32 yoki 128 bitli xash qiymatini beradi. 128-bitdan foydalanganda x86 va x64 versiyalarida bir xil qiymat hosil bo'lmaydi, chunki algoritmlar o'zlarining platformalari uchun optimallashtirilgan. MurmurHash3 SMHasher bilan birga chiqarildi - xash funktsiyasini sinab ko'rish to'plami.

MurmurHash2

MurmurHash2[6] 32 yoki 64 bitli qiymatni beradi. U bir nechta variantlarda, jumladan, qo'shimcha xeshlash va hizalanmış yoki neytral versiyalarga ruxsat beruvchi ba'zi variantlarda taqdim etildi.

  • MurmurHash2 (32-bit, x86) - asl nusxasi; ba'zi hollarda to'qnashuvni susaytiradigan nuqsonni o'z ichiga oladi.[7]
  • MurmurHash2A (32-bit, x86) - ishlatilgan sobit variant Merkle-Damgård qurilishi. Biroz sekinroq.
  • CMurmurHash2A (32-bit, x86) - MurmurHash2A, lekin bosqichma-bosqich ishlaydi.
  • MurmurHashNeutral2 (32-bit, x86) - sekinroq, lekin endian va tekislash neytral.
  • MurmurHashAligned2 (32-bit, x86) - sekinroq, lekin hizalanan o'qishlar (ba'zi platformalarda xavfsizroq).
  • MurmurHash64A (64-bit, x64) - original 64-bitli versiya. 64-bitli arifmetik uchun optimallashtirilgan.
  • MurmurHash64B (64-bit, x86) - 32-bitli platformalar uchun optimallashtirilgan 64-bitli versiya. Chiziqlar etarli darajada aralashmagani uchun bu haqiqiy 64-bitli xash emas.[8]

Dastlab MurmurHash2-da kamchilikni topgan kishi MurmurHash2 ning MurmurHash2_160 nomli norasmiy 160 bitli versiyasini yaratdi.[9]

MurmurHash1

Asl MurmurHash tezroq funktsiyani bajarishga urinish sifatida yaratilgan Qidiruv3.[10] Muvaffaqiyatli bo'lsa-da, u to'liq sinovdan o'tkazilmagan va Lookup3-da bo'lgani kabi 64-bitli xeshlarni taqdim eta olmagan. Keyinchalik MurmurHash2-da, multiplikativ xashni birlashtirgan juda oqlangan dizayni bor edi (o'xshash Fowler-Noll-Vo xash funktsiyasi ) bilan Xorshift.

Amaliyotlar

Kanonik dastur C ++, lekin turli xil mashhur tillar uchun samarali portlar mavjud, shu jumladan Python,[11] C,[12] Boring,[13] C #,[5][14] D.,[15] Lua, Perl,[16] Yoqut,[17] Zang,[18] PHP[19][20], Umumiy Lisp,[21] Xaskell,[22] Qarag'ay,[23] Klojure,[24] Scala,[25] Java,[26][27] Erlang,[28] Tez,[29] va JavaScript,[30][31] onlayn versiyasi bilan birgalikda.[32]

U bir qator ochiq manbali loyihalarda, eng muhimi, qabul qilingan libstdc ++ (ver 4.6), nginx (versiya 1.0.1),[33] Rubinius,[34] libmemcached (the C haydovchi uchun Yashirilgan ),[35] npm (nodejs paket menejeri),[36] maatkit,[37] Hadoop,[1] Kioto kabineti,[38] RaptorDB,[39] OlegDB,[40] Kassandra,[41] Solr,[42] vowpal wabbit,[43] Elastik qidiruv,[44] Guava,[45] Kafka[46] va RedHat Virtual Data Optimizer (VDO).[47]

Zaifliklar

Agar foydalanuvchi kirish ma'lumotlarini qasddan xash to'qnashuviga olib keladigan tarzda tanlashi mumkin bo'lsa, xesh funktsiyalari hujumga qarshi himoyasiz bo'lishi mumkin. Jan-Filipp Aumasson va Daniel J. Bernshteyn MurmurHash dasturini tasodifiy urug 'yordamida amalga oshirish HashDoS hujumlari deb nomlanuvchi ta'sirga ega ekanligini ko'rsatdi.[48] Dan foydalanish bilan differentsial kriptanaliz ular xash to'qnashuviga olib keladigan yozuvlarni yaratishga muvaffaq bo'lishdi. Hujum mualliflari o'zlaridan foydalanishni tavsiya qiladilar SipHash o'rniga.

Algoritm

algoritm Murmur3_32 bu    // Izoh: Ushbu versiyada barcha arifmetikalar imzosiz 32-bitli butun sonlar bilan bajariladi.    // Agar toshib ketgan bo'lsa, natijada modul kamayadi 232.    kiritish: kalit, len, urug '        c1 ← 0xcc9e2d51 c2 ← 0x1b873593 r1 ← 15 r2 ← 13 m ← 5 n ← 0xe6546b64 hash ← urug '    har biriga fourByteChunk of kalit qil        k ← fourByteChunk k ← k × c1 k ← k ROL r1 k ← k × c2 xash ← xash XOR k xash ← xash ROL r2 xash ← (xash × m) + n har qanday bilan qolganBytesInKey qil        qolganBytes ← SwapToLittleEndian (qolganBytesInKey) // Izoh: Endianni almashtirish faqat katta endianli mashinalarda kerak.        // Maqsad - qiymatning pastki qismiga to'g'ri keladigan raqamlarni joylashtirish,        // bu raqamlar past diapazonli raqamlarga ta'sir qilish uchun eng katta imkoniyatga ega bo'lishi uchun        // keyingi ko'paytirishda. Ma'noli raqamlarni joylashtirishni o'ylab ko'ring        // yuqori diapazonda ning yuqori raqamlariga katta ta'sir ko'rsatishi mumkin        // ko'paytirish, ayniqsa, bunday yuqori raqamlar bekor qilinishi ehtimoldan yiroq emas        // to'ldirilgan modulli arifmetika bo'yicha. Biz buni xohlamaymiz.                qolganBaytlar ← qolganBaytlar × c1 qolganBaytlar ← qolganBaytlar ROL r1 qolganBaytlar ← qolganBaytlar × c2 xash xash xash XOR qolganBaytlar xash ← xash XOR len    xash xash xash (xash >> 16) xash xash ← xash × 0x85ebca6b xash ← xash xor (xash >> 13) xash ← xash × 0xc2b2ae35 xash ← xash xash (xash >> 16)

C namunasini bajarish quyidagicha (endian protsessorlari uchun):

statik mos ravishda uint32_t murmur_32_scramble(uint32_t k) {    k *= 0xcc9e2d51;    k = (k << 15) | (k >> 17);    k *= 0x1b873593;    qaytish k;}uint32_t murmur3_32(konst uint8_t* kalit, hajmi_t len, uint32_t urug '){	uint32_t h = urug ';    uint32_t k;    / * 4 kishilik guruhlarda o'qing. * /    uchun (hajmi_t men = len >> 2; men; men--) {        // Bu erda endiannesses bo'yicha turli xil natijalar manbai.        // Bu erda almashtirish xash xususiyatlariga ta'sir qilmaydi.        memcpy(&k, kalit, o'lchamlari(uint32_t));        kalit += o'lchamlari(uint32_t);        h ^= murmur_32_scramble(k);        h = (h << 13) | (h >> 19);        h = h * 5 + 0xe6546b64;    }    / * Qolganlarini o'qing. * /    k = 0;    uchun (hajmi_t men = len & 3; men; men--) {        k <<= 8;        k |= kalit[men - 1];    }    // almashtirish bu erda * kerak emas *, chunki oldingi tsikl allaqachon mavjud    // past baytlarni har qanday endiannessga muvofiq past darajalarga joylashtiradi    // biz foydalanamiz. Svoplar faqat xotira bir qismga ko'chirilganda qo'llaniladi.    h ^= murmur_32_scramble(k);    / * Yakunlash. * /	h ^= len;	h ^= h >> 16;	h *= 0x85ebca6b;	h ^= h >> 13;	h *= 0xc2b2ae35;	h ^= h >> 16;	qaytish h;}

Shuningdek qarang

Adabiyotlar

  1. ^ a b "Java-da Hadoop". Hbase.apache.org. 24 Iyul 2011. Arxivlangan asl nusxasi 2012 yil 12 yanvarda. Olingan 13 yanvar 2012.
  2. ^ Tanjent (tanjent) yozgan, 3 mart 2008 yil 13:31:00. "MurmurHash birinchi e'lon". Tanjent.livejournal.com. Olingan 13 yanvar 2012.
  3. ^ "MurmurHash2-160". Simonhf.wordpress.com. 25 sentyabr 2010 yil. Olingan 13 yanvar 2012.
  4. ^ "MurmurHash3 Github-da".
  5. ^ a b Horvat, Adam (2012 yil 10-avgust). "MurMurHash3, C # / .NET uchun ultra tezkor hash algoritmi"..
  6. ^ "MurmurHash2 Github-da".
  7. ^ "MurmurHash2Flaw". Olingan 15 yanvar 2019.
  8. ^ "MurmurHash3 (MurmurHash2_x86_64 dagi eslatmani ko'ring)". Olingan 15 yanvar 2019.
  9. ^ "MurmurHash2_160". Olingan 12 yanvar 2019.
  10. ^ "MurmurHash1". Olingan 12 yanvar 2019.
  11. ^ "Python-dagi pyfasthash". Google. Olingan 13 yanvar 2012.
  12. ^ "Seungyoung Kim tomonidan qLibc-da C dasturi".
  13. ^ "murmur3 in Go".
  14. ^ Landman, Devy. "Devi Landman C # -da". Landman-code.blogspot.com. Olingan 13 yanvar 2012.
  15. ^ "std.digest.murmurhash - D dasturlash tili". dlang.org. Olingan 5 noyabr 2016.
  16. ^ "Toru Maesaka Perlda". metacpan.org. Olingan 13 yanvar 2012.
  17. ^ Yuki Kurihara (2014 yil 16 oktyabr). "Digest :: MurmurHash". GitHub.com. Olingan 18 mart 2015.
  18. ^ "stusmall / murmur3". GitHub. Olingan 29 noyabr 2015.
  19. ^ "MurmurHash3 dasturini PHP-ga kiritish". github.com. Olingan 18 dekabr 2017.
  20. ^ "MurmurHash3 ko'magi bilan PHP 8.1".
  21. ^ "tarballs_are_good / murmurhash3". Olingan 7 fevral 2015.
  22. ^ "Haskell". Hackage.haskell.org. Olingan 13 yanvar 2012.
  23. ^ "Qarag'ay". pack.elm-lang.org. Olingan 12 iyun 2019.
  24. ^ "Murmur3.java Github-da Clojure manba kodida". clojure.org. Olingan 11 mart 2014.
  25. ^ "Scala standart kutubxonasini joriy etish". 26 sentyabr 2014 yil.
  26. ^ Murmur3, Guavaning bir qismi
  27. ^ "Github-da Murmur3A va Murmur3F Java sinflari". greenrobot. Olingan 5 noyabr 2014.
  28. ^ "bipthelin / murmerl3". GitHub. Olingan 21 oktyabr 2015.
  29. ^ Daisuke T (2019 yil 7-fevral). "MurmurHash-Svift". GitHub.com. Olingan 10 fevral 2019.
  30. ^ raycmorgan (egasi). "Rey Morgan tomonidan Javascriptni amalga oshirish". Gist.github.com. Olingan 13 yanvar 2012.
  31. ^ garkort. "MurmurHash.js Github-da". Github.com. Olingan 13 yanvar 2012.
  32. ^ "MurmurHash-ning onlayn versiyasi". shorelabs.com. Olingan 12 avgust 2014.
  33. ^ "nginx". Olingan 13 yanvar 2012.
  34. ^ "Rubinius". Olingan 29 fevral 2012.
  35. ^ "libMemcached". libmemcached.org. Olingan 21 oktyabr 2015.
  36. ^ "MD5 dan shov-shuvga o'tish".
  37. ^ "maatkit". Google. 2009 yil 24 mart. Olingan 13 yanvar 2012.
  38. ^ "Kioto kabinetining spetsifikatsiyasi". Fallabs.com. 2011 yil 4 mart. Olingan 13 yanvar 2012.
  39. ^ Gholam, Mehdi (2011 yil 13-noyabr). "RaptorDB CodeProject sahifasi". Codeproject.com. Olingan 13 yanvar 2012.
  40. ^ "OlegDB hujjatlari". Olingan 24 yanvar 2013.
  41. ^ "Bo'luvchilar". apache.org. 2013 yil 15-noyabr. Olingan 19 dekabr 2013.
  42. ^ "Solr MurmurHash2 Javadoc".
  43. ^ "hash.cc in vowpalwabbit manba kodi".
  44. ^ "Elasticsearch 2.0 - CRUD va marshrutni o'zgartirish".
  45. ^ "Guava Hashing.java".
  46. ^ "Kafka DefaultPartitioner.java".
  47. ^ Virtual Data Optimizer manba kodi
  48. ^ "Buzilib qolgan shovqin: toshqinli DoS qayta yuklandi".

Tashqi havolalar