saját hash-függvény

Fórumok

Sziasztok,

van egy ca. 9500 db termékböl álló listám excelben, ezeket egy másik mappába olvasom be vba-val sorról sorra.
Van opció a duplán megjelenö termékek kiszürésére is. Jelenleg ez úgy müködik, hogy mielött berakom az éppen beolvasott terméket egy tömbbe, megnézem, hogy a tömbben már benne van-e. Ez elég lassú(kb 15mp.) és exponenciálisan nö több termékkel, de utána már csak ca. 7300 termék marad.

A következöt gondoltam ki és már müködik is nagyjából:
gyártok egy függvényt, ami a termékek leírásából gyárt egy hash értéket (jelenleg 1 és kb 1.000.000 között), long adattípusban. Egy bool tömbben (1.000.000 elemmel) megnézem, az adott hash index alatt "false" érték van-e - ha igen, berakom a terméket a másik tömbbe, és a hash index alatti értéket "true"-ra változtatom (a két listának az az oka, hogy meg kell tartanom az eredeti sorrendet a termékek között, ezért egy igazi hash tabella nem játszik).
Ez eddig jól müködik, csak még nem sikerült olyan függvényt gyártanom, amelyik az összes termékleírásra tud egyedi hash értéket generálni (kb 7200-ra sikerül*).

Van valakinek ötlete egy gyors és müködö függvényre? Excelben/VBA-ban nincs md5 vagy sha1, ezeket idegen könyvtárakból nem akarnám betölteni, és ezek nem is egésszámú indexeket generálnának. Persze ha sikerül lejebb szorítani a max. hash értéket, azért sem haragszom.

Jelenleg a betük ascii értékét a karakterlánc beli elhelyezkedésükkel kombinálom és modulo 6 maradékkal dolgozva más és más értéket is hozzá adok a maradékosztály által elöállított blokkoknak.

elöre is köszi a tippeket.

*egy eshetöség létezik még, hogy az eredeti, tömb-végig-keresös-algorithmus hibázik és tényleg csak ca. 7200 termék van duplák nélkül - ezt még nem teszteltem.

Hozzászólások

Ha nem tömbbe töltenéd, hanem hashbe? Én ilyenkor simán kulcsként használom a már látott elemeket, bár vbat nem szoktam, és ha egy kb 10k hosszú listán végigszaladni 15 sec az nagyon gyász...

mármint hogy értve, hogy hashbe?

vba elég korlátozott, alapból nincs asszociatív tömb. és hát ugye a 10k listán ca. 10k-szor kell végig menni, innen ered a 15s

és a fö kérdés, a hash érték elöállítása ezzel még mindig nem megoldott
--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync

jahogy nincs hash (mármint asszociatív tömb), akkor szorri.

Ill, biztos vagy benne? http://stackoverflow.com/questions/1309689/hash-table-associative-array…

úgy látom valami ilyesmi mehetne (erősen pseudo kódos, szorri)


Dim d As dictionary
Set d = New dictionary
Dim nev As String

While not EOF termékek
  nev = nev_beolvasasa(aktuális sor)
  If not d("termekneve") Then
    amit_csinalni_akarsz.
    d("termekneve") = True
  End If
End While

---
Egyébként úgy látom, hash függvények is vannak:
http://stackoverflow.com/questions/14717526/vba-hash-string/14749855#14…

egyébként tényleg így van, egy komplex kalkulációs segédeszköz része - és azt hiszem kijelenthetem, ennek segítségével az ajánlatadások kb faktor 10-el, ha nem többel, lettek gyorsabbak és "melléktermékként" egy grafikus sémát is kidob a rendszer, ami a cég ügyfeleinél nagyon jó visszhangra lelt.
Az Excel szerintem zseniális és a VBA-val is úgy ahogy megbékéltem már - vannak (nagy) hiányosságai az objektorientálás terén, de ez van

--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync

Nekem nem kell mondani, egy számtech/fotó kisker/nagyker cégcsoportnál vagyok jelenleg, tudom mit művelnek Excelben azt is, hogy mi az előnye, mi a hátránya.

A probléma ott kezdődik, mikor valaki fogalom nélkül elkezd a partvonalról okoskodni anélkül, hogy realizálná, hogy miért - jelen esetben az Excel - lett a kvázi ipari standard.

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

Mert? Az excel pont erre való. Én szeretem a perlt, de van egy csomó olyan, amit excelben rém kényelmes megcsinálni, mert sokkal könnyebb interaktívan beleturkmányolni.

A VBA fehér ember számára pont sokkal átláthatóbb mint a perl. (Fehér ember alatt érts nem programozót, és igen, ettől még szerintem is randa). Ja, és persze ott van, nem kell perl interpétert telepíteni, fájlokkal baszakszani, meg command linenal. Ráadásul a felvetett probléma kb "triviális". Sem kirívóan sok adat nincs benne, sem semmi bonyi probléma, a gugli alapján látszik, hogy kb 1x1, a topik létezésének egyetlen oka, hogy a kérdező valahogy átsiklott felette.

Szal all in all, ez egy tipikus kalapcsáod van, mindent szögnek nézel szűklátókörű vélemény volt.

Erről jut eszembe: egyszer egy ismerős kérte, hogy segítsek már neki valamiben, mert Excelben szeretne valamilyen kalkulációs dolgot elvégezni (gyakorlatilag adott paraméterek alapján halom adat közül keresni kellett megfelelő dolgot). Elvileg Excelben is megoldható lett volna, egy Excel hakkoláshoz jobban értő talán még egyszerű módot is talált volna rá, de számomra triviálisabbnak tűnt az Access az SQL és a formok, riportok miatt.

Úgy, hogy VBA-nak úgy kellett utánanézem, a srácnak meg főleg (villamosmérnökként egyetemen tanult ugyan egy kis programozást, de egyrészt sosem szerette másrészt nem is ment neki annyira ha jól emlékszem), plusz SQL alapjait is nekem kellett elmagyarázni, ráadásul az Access-t sem használta szerintem, egy kis iránymutatással egész jól abszolválta a feladatot.

Igen, a feladat olyan, amire én helyből nyitnám a Visual Studiot/Eclipset/akármit, viszont azért elég jól példázza, hogy azok, akik nem értenek hozzá kis segítséggel képesek "programocskákat" készíteni, amellyel hatékonyabbá tehetik a munkájukat. Ebben van az MS Office egyik előnye. Sokszor egyszerűbb csinálni egy Exceles számolótáblát valamire, mint nekiállni kódolni.

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™

na itt az igért update:
- saját hash-függvény kilöve, nem sikerült olyat kitalálnom, ami mind a ca. 7300 elemre egyedi hash-t adott volna
- ha sikerült is volna, a jövöben több terméknél nem lehettem volna biztos benne, hogy nincs ütközés
- minél komplikáltabb volt a függvény, annál lassab volt a feladat (ca. 7100-nál már 4-6mp)
- dictionary megoldás: 1mp

köszi mindenkinek a segítséget!

--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync

Próbáld ki esetleg azt is, hogy nem beolvasás közben keresgélsz duplikációkat, hanem először beolvasol mindent, és csak utána szűrsz.

A Remove Duplicates gomb nem működik excelben?

a termék/árlistát nem fogom megváltoztatni, az évente 2x van hivatalosan kiadva. ott vannak a duplák benne, mert 6 különbözö lapon vannak az egyes termék kategóriák felsorolva, de vannak átfedések.
ezt a listát emelem át VBA-val egy saját, új excel-mappába, amiben a kalkuláció és konfiguráció történik

--------
HOWTO: Zentyal+Zarafa+Setup+Outlook+Thunderbird+mobilephone sync

"a termék/árlistát nem fogom megváltoztatni, az évente 2x van hivatalosan kiadva. ott vannak a duplák benne, mert 6 különbözö lapon vannak az egyes termék kategóriák felsorolva, de vannak átfedések"

Hajjaj, az ilyeneket utáltam legjobban, mikor fel kellett dolgoznunk. Jellemzően az egyes lapok fejlécei (még az azonos funkcionalitásúak) véletlenül sem egyeztek meg, egy-egy kiadás között random variálva lettek. Van rá toolunk, de mindig kell picit hozzáigazítani egy listához. Nem értem, hogy sokan miért nem képesek kiadni normálisan, konzisztens listát.

----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™