Results 1 to 4 of 4

Thread: ingebouwde hashfunction ?

  1. #1
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357

    ingebouwde hashfunction ?

    Is er een makkelijke hash functie voor een string in Delphi? Evt sysutils.Hashname, maar die is case insensitive, voor pansichar only, en dus niet zo heel simpel.

    Achtergrond:
    Ik heb een klein probleempje ontdekt in een datastructuur, de key is een string met vn datetime info, en onder bepaalde omstandigheden kan die (tot op de msec) gelijk zijn.

    Het is in principe een file, dus ik heb ook een filename, en een hash hiervan toevoegen aan de key zou een oplossing kunnen zijn (aangezien de files in dezelfde dir staan zijn ze gegarandeerd anders).

  2. #2
    TStringHelper.GetHashCode maar die zet de string weer om naar uppercase
    Je kunt natuurlijk even de source volgen en de functie kopiëren als case sensitive.
    De pAnsiChar zou niet zo'n probleem mogen zijn omdat de conversie automatisch is (of bevatten je filenames unicode-only characters).

    Quote Originally Posted by marcov View Post
    Achtergrond:
    Ik heb een klein probleempje ontdekt in een datastructuur, de key is een string met vn datetime info, en onder bepaalde omstandigheden kan die (tot op de msec) gelijk zijn.

    Het is in principe een file, dus ik heb ook een filename, en een hash hiervan toevoegen aan de key zou een oplossing kunnen zijn (aangezien de files in dezelfde dir staan zijn ze gegarandeerd anders).
    Ik zie hier eigenlijk geen noodzaak om case sensitive te werken. Filenames in Windows zijn ook case-insensitive dus een case-insensitive hash functie zou geen probleem mogen zijn.

    Indy heeft geloof ik ook kant en klare hash-functies (in idHash?).

  3. #3
    Kan je de filenames niet zelf als key gebruiken? Waarom moet het een hash zijn?

    Overigens is de logica in TStringHelper.GetHashCode en GetHashName ongeveer hetzelfde, een simpel for loopje en wat geneuzel met xor. Hashname heeft vooral een hoop overhead om te kijken naar multi-byte situaties, maar het lijkt me dat je gewoon de string data zelf kan hashen, alsof het een byte array is, zonder je zorgen over te maken over character sets.
    1+1=b

  4. #4
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Er zijn twee issues, het acute en het algemene geval.

    Het acute geval is niet zo belangrijk, want de live data is relatief traag (het zijn altijd hele beelden die verwerkt en op disk opgeslagen zijn, en dat is natuurlijk altijd trager dan het hashen van de filenaam ervan). Omdat ik snel wat moest hebben, heb ik er hashname() ingeramd, en nu is het al live. Gelukkig is de hashcode niet persistent, dus die kan ik zelfs later nog veranderen. De enige requirement is dat dit ook in een aantal legacy projecten gefixed moet worden dus XE3 compatibiliteit zou handig zijn.

    Op zich had performancewise de hele filename er ook in geramd kunnen worden, maar die namen zijn vrij lang, en dit is eigenlijk al alleen om gevallen die een timestamp tot op de ms gelijk zijn te kunnen onderscheiden. Een additie tot de timestamp key, niet de key zelf.

    Het algemene geval is vooral iets om in het achterhoofd te houden voor wat containertypes die ik onderhoudt. Daar wordt wel over miljoenen items historische gelopen, dus dan is het wat nuttiger. Enfin, mijn resultaten:

    Er zit complexe hashing in generics.collections e.d., maar ik heb daar nog geen makkelijk bruikbare functie voor een string gevonden.

    In DXE10 zit system.hash maar dat is MD5/SHA1 dus overkill, en zit niet in XE3. Zoals vaak met Indy, gebruikt idhash nogal gekke constructies uit een ver D8 verleden om pointers te vermijden. Het laadt alles eerst in een stream, <shudder>. Deze beide zijn dus minder dan hashname().

    TStringHelper.gethashcode is een goede suggestie. Ik zal daar eens verder induiken. Hmm, mijn XE3 source lijkt hem niet te implementeren, altijd -1.

    Ze zijn wel allemaal zo simpel dat je het binnen 5 min zelf kan doen, b.v. gebaseerd op FPC code, en zelfs goedkoper door direct op words te werken, zonder de ascii conversie. Mocht het nodig zijn, weet ik waar ik moet zoeken!

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •