Eşsiz değerde hash = benzersiz bir karma?

4 Cevap php

Teorik olarak benzersiz bir değer benzersiz bir değer üretmek karma nedir?

Id ve kod: Diyelim ki 2 sütun ile bir DB tablo var diyelim. id otomatik artan bir int ve kod bir varchar. Ben yaparsam ...

$code = sha1($id);

... Ve sonra $ id olarak aynı satıra mağaza $ kodu. Benim kod sütunu da benzersiz olacaktır?

Ne şimdiki zaman append olur? örneğin:

$code = sha1($id . time());

Teşekkürler.

4 Cevap

Genel olarak, cevap hayır. Bu göstermek saçmadır: SHA-1 2 ^ 160 farklı çıkışları var - 160 bit, ama bu (örneğin, 2 ^ 320 farklı 40-bayt dizeleri olduğunu çok daha fazla girişler vardır ve bunlar bir bütün harita olamaz özgün çıktı).

Değerlerinin yeterli bir alt kümesi göz önüne alındığında, cevap belki bir. Bu kesin algoritma ve alt kümenin büyüklüğüne bağlıdır: olası girişlerin sayısı mümkün çıkışların sayısından daha az ise, o zaman mümkün (ancak garanti değil) olduğunu. Bu düşünmeye zaman, akılda birthday paradox tutmak yararlı olabilir: Bir çarpışma olasılığı girişlerin sayısı ile doğrusal olarak artmaz.

İki farklı değerler aynı karma vermek, küçük bir olasılık vardır. Çok küçük olmasına rağmen, bu olası değil.

Bu karma algoritması bağlıdır. Ama teorik olarak, karma tam karma benzersiz olmayabilir için bir potansiyel var orijinal dizesi olarak aynı sürece.

Bir değer bir karma orijinal değerinin yoğunlaştırılmış bir temsilidir. Eğer etki alanında benzersiz ne yapmak parçaları kaybediyor karma oluşturmak için bilgi parçalarını kaldırma ve dolayısıyla değeri benzersiz olmayacağı olasılığını artırarak. Benzersiz olacağını garanti tek yolu sağlama amacı yendi orijinal değerini kendisi kullanmaktır.

Bir soru sormak için var, neden bunu yapmak istersiniz? Veritabanı zaten benzersiz bir tanımlayıcı ile sunmak ise neden başka bir benzersiz tanımlayıcı oluşturmak gerekiyor?

Ayrıca ihtiyacınız ne ise UUID sizin için birincil anahtarları stil üretecektir PHP pek çok veritabanı motorları olduğunu dışında düşünebilirsiniz.

Burada nokta böyle SHA1 () gibi karma algoritmalar bu tip iş için tasarlanmamış olmasıdır; iki (potansiyel olarak çok uzun) bir dize girişler aynı olduğunu doğrulamak içindir. Bir tam benzer, ancak dize ile bir çarpışma şansı çok uzak ama çok farklı dizeleri ile bir çarpışma şansı çok daha yüksek olur.