Uzun bir çıkış uzunluğu olan bir PHP karma işlevi?

7 Cevap php

Benim kod içinde ben (sınırsız uzunlukta pratik olan) URL'lerin üreten sağlamalarının ediyorum. Ben şu anda bir çarpışma küçük bir şansı var biliyorum ki,) (sha1 kullanıyorum, ama ben bu yüzden ben de, hatta çarpışma şansını düşürmek için bu boş alanı kullanmak olabileceğini hissediyorum yılında karma depolamak için 255 bayt var daha fazla.

Ya var mı:

  1. Uzun veya özelleştirilebilir karma uzunluğu ile başka bir PHP karma işlevi?
  2. Uzun bir karma oluşturmak için bir değişken uzunlukta girişi ile sha1 gibi sabit uzunlukta bir hash fonksiyonu kullanarak bir yolu?

Ya da, SHA1 en 20-bayt karma bir şey için yeterince iyi olduğunu ve bu konuda endişe durdurmak gerekir?

7 Cevap

Ya da, SHA1 en 20-bayt bir şey için yeterince iyi olan ve bu konuda endişe durdurmak gerekir?

Kesinlikle.

Hashtables, Pigeonholes, and Birthdays
http://www.codinghorror.com/blog/archives/001014.html

Let görmek ... http://www.cryptography.com/cnews/hash.html

Q: How hard would it be to find collisions in SHA-1?
A: The reported attacks require an estimated work factor of 2^69 (approximately 590 billion billion) hash computations

Riski oldukça düşüktür benziyor ... ^ _ ^

Eğer gerçekten endişeli iseniz, bir 256 almak - veya 512-bit hash (32 veya 64 karakter).

Eğer gerçekten iseniz, gerçekten paranoyak, bir tuz ekleyin.

Bundan daha paranoyak iseniz, bu tür MD5 ve SHA-256 gibi bir uzun için iki karmaları, bağlamak.

Her zaman, başına / mevcut karma (ondalık veya onaltılık) bir sıralı kimliği eklemek olabilir?

Tabii bir sabit uzunlukta karma olmazdı ama kodu) eşsiz ve b) olmayan guessable (birisi sıralı kısmını fark bile onlar karma / rest tuzlama edildi şekilde bilemeyiz olduğunu bilirdiniz kodu).

Eğer kimseden bu karmaları saklamaya çalışıyorsunuz değil tabii eğer o zaman neden sadece ilk etapta sıralı kimliği kullanmak değil mi?

Eğer onunla gerçekten deli almak istiyorsa, ne yapabileceğini URL farklı bölgelerinde sağlamalarının birleştirmek olduğunu.

URL uzun 40 karakter olduğunu söylemek - 5 parçaya bölün: Eğer edeceğiz Teoride vs ..., karakter 1-8 SHA1 olsun karakter 9-16 arasında SHA1 bağlamak, 17-24 SHA1 bitiştirmek sonra 2 800 olanakları ve sadece çarpışma endişesi başlamak için ihtiyacınız olacaktır 2 (69*5) = 2 345 = 7.2 * 10 103 sonra satırları.

ama dediğim gibi biz düz Bu gibi yöntemler ile deli kasabaya gidiyoruz, dedi.

Ne yapmaya çalışıyorsun tam olarak ne olduğunu bilmiyorum, çünkü ben iki kez veri girmek istemiyorum bir varsayım yapacağız ve hızlı çarpışmalar tespit yeteneği istiyorum. Bu durumda I pseudocode aşağıdaki algoritmayı öneriyoruz:

found = false
hv = hash(urlValue)
if table[hash,url] contains pair (hv,urlValue)
   found = true
endif

if (not found)
   insert table (hv,urlValue)
endif

Veritabanındaki bakmak ups hızlandırmak için karma sütun üzerinde benzersiz olmayan bir dizin oluşturun. Bu (hash, url) üzerinde sorgu hızla ilerlemesine izin verecek - Normal durumda karma muhtemel benzersiz beri sadece tek bir satıra baktığımızda, henüz gerçekten kabul veya gerçek url göre inkar karar veriyorlar. Bu kısa bir hash fonksiyonu kullanmak için izin verir. Bu herhangi bir ek depolama içermeyen böylece muhtemelen zaten daha sonra kullanmak üzere url depolamak.

Eğer söndükten hash anahtarı varsa Eh, sadece mantıklı. Aksi takdirde, bir tablodaki veriler taşma riski vardır.