2011-11-05 15 views
5

İki dizim var: char data1 [length] uzunluğu 8'in katları, yani uzunluk 8, 16,24 olabilir ... Dizi bir dosyadan okunan ikili veri içeriyor Bu ikili modda açık. Dosyadan okumaya devam edeceğim ve okuduğum her zaman okuma değerini bir hash tablosunda saklayacağım. Bu ikili verinin bozulması, rasgele bir dağılıma sahiptir. Her bir diziyi bir araya getirmek ve char'ı belirli verilerle tekrar arayabilmek için bunları bir karma tabloda saklamak istiyorum. Bu görevi gerçekleştirmek için iyi bir karma işlevi ne olurdu. TeşekkürlerRastgele ikili dizeleri sağlama için uygun sağlama işlevi

Lütfen bunu C++ ve c'de yazdığımı unutmayın, böylece bir çözüm sunmayı seçtiğiniz herhangi bir dil harika olur.

+0

Neden sadece Berkeley DB4 * 'i alıp o kütüphanenin tüm detayları ele almasın? –

+0

Ve karma çarpışmalarla ilgili ne yapacaksınız? –

cevap

3

okumak veri 8 bayt uzunluğunda ve gerçekten rastgele dağılmış ise ve karma kodudur 32 bit, peki ya bu olması gerekiyorsa: Eğer daha fazla hıza ihtiyaç

uint32_t hashcode(const unsigned char *data) { 
    uint32_t hash = 0; 
    hash ^= get_uint32_le(data + 0); 
    hash ^= get_uint32_le(data + 4); 
    return hash; 
} 

uint32_t get_uint32_le(const unsigned char *data) { 
    uint32_t value = 0; 
    value |= data[0] << 0; 
    value |= data[1] << 8; 
    value |= data[2] << 16; 
    value |= data[3] << 24; 
    return value; 
} 

bu kod muhtemelen yapılmış olabilir data'un her zaman const uint32_t * olarak yorumlanacak şekilde düzgün şekilde hizalandığını garanti ederseniz çok daha hızlı.

+0

Soruda belirtildiği gibi, uzunluk 8'in katları olan bir sayıdır. Fikirlerinizi sadece 8 baytlık değil 8'lerin mutlipleine nasıl genişletebilirim? –

+0

hashcode işlevine bir 'size_t datalen 'parametresi ekleyerek. Kodu anladığınızda, bu yapılması gereken önemsiz bir şeydir. Kodu kolayca yazabilmem için bile yazdım. –

+2

+1: veriler gerçekten rastgele olsa da (burada "üniforma" demek istediğimizi varsayalım), hatta xor'a bile ihtiyacınız yoktur; sadece ilk 32 biti sizin karma olarak kullanın. –

2

Projelerimden birinde başarıyla MurmurHash3 kullanıyorum.

Artıları:

  • O hızlı olduğunu. Çok hızlı.
  • Sözde düşük bir çarpışma oranına sahip.

Eksileri:

  • Bu şifreleme uygulamaları için uygun değildir.
  • Herhangi bir biçimde veya biçimde standartlaştırılmış değil.
  • X86 olmayan platformlarda taşınabilir değildir. Ancak, gerçekten ihtiyacınız varsa, onu taşıyabilmeniz için yeterince küçüktür - neredeyse aynı şey olmasa da, Java'ya yönlendirebildim.

Örn. Hızlı karma tablosu uygulaması ...

+0

Aynı zamanda projemde uygulamak istiyorum. Aslında MurmurHash üzerinden ikili dizgiye geçmek istiyorum. Ancak Murmur karma algoritması da negatif karma değer üretir. bu yüzden sorunla karşı karşıyayım. Yukarıda bahsettiğin gibi aynı kodu uygularım. herhangi bir karma algoritma ile benzer mesaj için benzer karma değer verir. Örneğin, sadece bir karakterde değişiklik varsa o zaman karma değerinde daha az değişiklik olur. –

İlgili konular