[hashing / fingerprinting] Snel hash algoritme

Pagina: 1
Acties:

  • Juup
  • Registratie: Februari 2000
  • Niet online
Peoples,

Om geheugen te besparen wil ik van alle URLs in een hele lange lijst (± 1 GB totaal) een fingerprint maken. Ik heb we al een algoritme (zal het posten als ik op m'n werk zit) maar dat is LANGZAAAAAM, ongeveer 2 URLs per seconde ofzo (ultra sparc IIi op 440 MHz).

Weet iemand een snellere hashfunctie?

Edit1: Ik doe het in Perl (slechte taal voor dit soort dingen, ik weet het) maar de taal maakt niet zo veel uit.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • lordsnow
  • Registratie: Maart 2000
  • Laatst online: 12-09 11:59

lordsnow

I know nothing

Je bedoelt zeker harde-schijf ruimte... toch?

Ik ben wel nieuwsgiering.. mischien wil je wat meer uitleggen wat 't probleem is?

Je wilt de grote van het bestand verkleinen, en het doorzoeken van dit bestand snel houden?

Hoe groot is de samenhang van de URLs? Mischien is een lichte vorm van text compressie een uitkomst?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

deze komt van de URL class (eigelijk komt ie van de URLStreamHandler class) van Java. Maar met Perl zul je wel hetzelfde kunnen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 /**
     * Provides the default hash calculation. May be overidden by handlers for
     * other protocols that have different requirements for hashCode
     * calculation.
     * @param u a URL object
     * @return an <tt>int</tt> suitable for hash table indexing
     */
    protected int hashCode(URL u) {
      int h = 0;

      // Generate the protocol part.
      String protocol = u.getProtocol();
      if (protocol != null)
        h += protocol.hashCode();

      // Generate the host part.
    InetAddress addr = getHostAddress(u);
    if (addr != null) {
        h += addr.hashCode();
    } else {
        String host = u.getHost();
        if (host != null)
          h += host.toLowerCase().hashCode();
      }

      // Generate the file part.
      String file = u.getFile();
    if (file != null)
        h += file.hashCode();

      // Generate the port part.
    if (u.getPort() == -1)
        h += getDefaultPort();
    else
        h += u.getPort();

      // Generate the ref part.
      String ref = u.getRef();
    if (ref != null)
        h += ref.hashCode();

    return h;
    }

Deze moet vast wel meer dan 2 per seconden aan kunnen :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

kun je er geen database onder hangen ipv een enorme file? Die zijn voor dit soort dingen geboren :)

  • Juup
  • Registratie: Februari 2000
  • Niet online
Okee meer info:
Het is werkgeheugen, geen HD stuff. Ik zou wel een DB kunnen gebruiken, maar dan verplaats ik het probleem alleen want dan heb ik een DB server nodig met veel geheugen. Ik moet CONTINUE (10x per seconde) bij nieuwe URLs checken of ik ze al gehad heb. Nu heb ik wel een lichte compressie omdat ik weet hoe de URL's er ongeveer uitzien. Ik wil MEER comprimeren.

Op dit moment gebruikt mijn Perl array van ~ 10^6 elementen meer dan 1.5GB werkgeheugen. Dat is meer dan 1kB per URL! Terwijl een URL maximaal 256 Byte is.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • Juup
  • Registratie: Februari 2000
  • Niet online
Op zaterdag 19 januari 2002 12:29 schreef Alarmnummer het volgende:
deze komt van de URL class (eigelijk komt ie van de URLStreamHandler class) van Java. Maar met Perl zul je wel hetzelfde kunnen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 /**
     * Provides the default hash calculation. May be overidden by handlers for
     * other protocols that have different requirements for hashCode
     * calculation.
     * @param u a URL object
     * @return an <tt>int</tt> suitable for hash table indexing
     */
    protected int hashCode(URL u) {
      int h = 0;

      // Generate the protocol part.
      String protocol = u.getProtocol();
      if (protocol != null)
        h += protocol.hashCode();

      // Generate the host part.
    InetAddress addr = getHostAddress(u);
    if (addr != null) {
        h += addr.hashCode();
    } else {
        String host = u.getHost();
        if (host != null)
          h += host.toLowerCase().hashCode();
      }

      // Generate the file part.
      String file = u.getFile();
    if (file != null)
        h += file.hashCode();

      // Generate the port part.
    if (u.getPort() == -1)
        h += getDefaultPort();
    else
        h += u.getPort();

      // Generate the ref part.
      String ref = u.getRef();
    if (ref != null)
        h += ref.hashCode();

    return h;
    }

Deze moet vast wel meer dan 2 per seconden aan kunnen :)
Ben ik nu blind of zie ik hier *DE* hashfunctie niet tussen staan?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.

Pagina: 1