2013-04-25 20 views
5

JavaScript'te uygulanan düşük çarpışmalarla hızlı bir karı arıyorum. Bir kripto hastası olması gerekmiyor. Temel olarak, belirli bir dosyanın büyük (video) dosyalarda bazı yükleme sürelerini kaydetmek için bir kullanıcının hesabına daha önce yüklendiğini (veya kısmen yüklendiğini) görmenin bir yolu olarak kullanıyorum.Dosyalara karşı JavaScript için hızlı, düşük-çakışmalı kripto karma hashtag

Dosya dilimlerini okumak için yeni HTML5 Dosya API'sini kullanıyorum. Daha sonra, dosyanın bir özetini vermek için bunu SparkMD5'a uzatırım. SparkMD5'in artımlı bir karma yapmama izin vermesini seviyorum, böylece hafızada bütün şeyi okumak zorunda kalmam.

Genel olarak, SparkMD5 ihtiyaçlarım için çalışmaktadır, ancak büyük dosyalar için bana hash'ım (bir 300MB dosya için yaklaşık 30 saniye) almak biraz zaman alabilir. Bunu ideal olarak azaltmak isterim. Karma fonksiyonlar hakkında bilgili değilim, bu yüzden bir şeyleri yönlendirmek istemiyorum ve ideal olarak zaten uygulanan bir kütüphaneyi arıyorum. Burada

+1

Ne kabul edilebilir bir süre olurdu? MD5'ten daha hızlı olması beklenen CRC32'ye bakabilirdiniz, ancak fark edilebilir olmayabilir ve muhtemelen daha yüksek bir çarpışma oranına sahip olacaksınız. – Graham

+0

Yea, CRC32'ye baktım ama çarpışma oranının% 0.4 olduğu bir yerde okudum. Bunun doğru olup olmadığını bilecek kadar bilgili değilim ama başkalarının yüksek bir çarpışma oranına sahip olduğunu gösteren başkaları da var gibi görünüyordu. –

+0

Sorunuzu cevaplamak için, bir 1GB dosya için bile sadece birkaç saniye sürmesini istiyorum. Bunun gerçekçi olup olmadığını bilmiyorum. –

cevap

1
Ben benchmarked çeşitli karma algoritmalar

ve en hızlı seçenek buldum var:

  • sadece 32 bitlik özet almayı iMurmurHash kullanmak gerekir. Bu size 2 ** 14 (16,000) karmadan sonra çarpışmalar verecektir.

  • 32 bitten daha fazlasına ihtiyacınız varsa SparkMD5 kullanın. Hızlı 64 veya 128 bit Murmur uygulaması bulamadım, ancak SparkMD5 şaşırtıcı derecede hızlıydı (75 MB/sn).

    • Eğer SparkMD5 en artırımlı karma bazı ılımlı yükü muzdarip görünüyor gibi SparkMD5 onları beslemek önce büyük parçalar halinde katılmadan dizeleri düşünün artırımlı güncellemeleri gerekir.

Bu öneriler saf JavaScript içindir. Onları dizelerle karşılaştırdım, ancak SparkMD5 ArrayBuffers'ı da alıyor.


Eğer Düğüm hızlı karma modüllerini istiyorsanız

, en iyi seçenek biraz farklıdır:

  • Eğer Tamponlar karma ediyorsanız: kullanın yerleşik MD5 algoritması ile crypto modülü.

    • Bunun istisnası şudur: artırımlı karma gerekmiyorsa, ve Eğer murmurhash-native kullanmak size bir yerli npm bağımlılık OK ile konum 500'den fazla MB/sn verim, ihtiyaç ve Bazı ekstra performans için. 128 bitten bile sindirim boyutlarını test etmedim, çünkü karmaşama o kadar hızlı ki, bu da bir darboğaz olma ihtimali taşıyor.

      (yani murmurhash yerli teknik olarak artan karma destekler Not ama Düğüm en yavaştır yerleşik bu modda MD5 algoritması.)

  • olmayan aşamalı tek bir sicim karma ise, dönüştürmek bir Tampon'a ve önceki mermi noktasına bakın.

  • Eğer adım adım dizeleri karma ediyorsanız: Yalnızca 32 bit gerekirse

    • , iMurmurHash kullanın. Bu size 2 ** 14 (16,000) karmadan sonra çarpışmalar verecektir.

    • 32'den fazla bit'e ihtiyacınız varsa: Yerleşik şifreleme modülünü MD5 algoritmasıyla birlikte kullanın.

      • Ben de dizeleri örtülü olarak size kripto modülüne onları geçerken Buffers dönüştürülür beri, daha büyük parçalar halinde bir araya dizeleri katılmadan denemenizi öneririz ve her Tampon oluşturma oldukça yavaştır. Performans, genellikle doğal işleme fonksiyonu çok hızlı olduğu için Tampon oluşturma ve dizgi birleştirmesi ile darboğazlanır.
+0

Bilinmesi gerekenler iMurmerHash. SparkMD5'in iki katı kadar hızlı görünüyor. Orijinal gönderiim 300MB/30 saniye olduğunda 75MB/sn aldığınızı belirttiniz. Daha küçük parçalardan (bahsettiğin ek yük) veya daha yavaş bilgisayarlardan (soru 4 yıl önceydi) dolayı daha yavaş olup olmadığından emin değilim. –

+0

Kriterümdeki parçalar çok küçük - sadece birkaç bayt - bu yüzden daha yavaş bilgisayarları ve daha yavaş JavaScript motorlarını tahmin ediyorum. –