Karma Kodu ve Sağlama Toplamı - fark nedir?


115

Anladığım kadarıyla, bir karma kod ve sağlama toplamı benzer şeylerdir - bir veri bloğu için hesaplanan ve nispeten benzersiz olan sayısal bir değer .

Örneğin, aynı sayısal hash / checksum değerini veren iki veri bloğunun olasılığı, uygulamanın amaçları için göz ardı edilebilecek kadar düşüktür.

Öyleyse, aynı şey için iki kelimemiz mi var, yoksa hash kodları ile sağlama toplamları arasında önemli farklar var mı?


3
Aşağıdaki cevapları özetlemek gerekirse: Bir karma kod, çarpışma olasılığını en aza indirecek şekilde girdiyi küçük bir sayıya indirger. Öte yandan bir sağlama toplamı, çarpışma olasılığını en aza indirecek şekilde girdiyi küçük bir sayıya indirir. Bu açıklamayı keyfi olarak yeniden yazarak bir sesi diğerinden farklı kılabilirsiniz.
Dan Stahlke

3
@DanStahlke - Hayır, aşağıdaki cevapların söylediği bu değil. Evet, ikisi de girdiyi daha küçük bir sayıya indirgiyor. Ancak bunu yapmanın pek çok yolu var, hangi algoritmanın kullanılacağını nasıl seçmeli? Bu, hedefinize bağlıdır. En iyi iki cevapları özetlemek gerekirse: Amaç bir kontrol karakterinin olan " en yaygın hataları tespit etmek ". Senaryonuzdaki "en yaygın" hatalar için farklı bir sağlama toplamı veren bir algoritma seçin. Bir veya iki bitin değiştirilmesinden endişe ediyorsanız , bu belirli hatanın tespitini garanti eden bir algoritma seçebilirsiniz ! Bu çok özel bir değiş tokuş.
ToolmakerSteve

1
@DanStahlke - Öte yandan, hash kodu çok çeşitli olası takasları kapsar. Bir hash tablosu oluştururken kullanılan bir değeri kastediyorsak, çarpışmalar olacağını biliyoruz , bunların çoğu. Bu çok farklı bir değiş tokuştur (bir sağlama toplamından). Çarpışmaları ortalama olarak azaltmaya çalışıyoruz . Hiçbir şeyi garanti etmiyoruz. Yalnızca bir bit farklılık gösteren, ancak aynı hash'i veren bazı girişler olabilir. Eğer ortalama olarak hash değerlerinde iyi bir yayılma elde edersek , bu tamamen iyidir . Yine de bir sağlama toplamı için kabul edilemez.
ToolmakerSteve

Yanıtlar:


72

Bir sağlama toplamının mutlaka bir karma kod olduğunu söyleyebilirim . Ancak, tüm karma kodlar iyi sağlama toplamları oluşturmaz.

Bir sağlama toplamının özel bir amacı vardır - verilerin bütünlüğünü doğrular veya kontrol eder (bazıları hata düzeltmesine izin vererek bunun ötesine geçebilir ). "İyi" sağlama toplamlarının hesaplanması kolaydır ve birçok veri bozulmasını tespit edebilir (örn. Bir, iki, üç hatalı bit).

Bir karma kod basitçe, verileri bir değerle eşleştiren matematiksel bir işlevi tanımlar . Veri yapılarında (örneğin bir karma tablo) bir indeksleme aracı olarak kullanıldığında, düşük bir çarpışma olasılığı arzu edilir.


6
Belki biri diğeri olarak kullanılabilir, ancak farklı tasarım hedefleri olduğunu düşünürsek, bu sadece konuyu karıştırır.
Wim Coenen

8
@gumbo: hayır, her karma kod bir sağlama toplamı değildir. Aşağıdaki MSalters dize örneğine bakın.
MarcH

41

Her birinin arkasında farklı bir amaç var:

  • Karma kod - etki alanında rastgele olacak şekilde tasarlanmıştır (karma tablolarda ve benzerlerinde çarpışmaları en aza indirmek için). Kriptografik karma kodlar ayrıca hesaplama açısından tersine çevirmek mümkün olmayacak şekilde tasarlanmıştır.
  • Toplamı kontrol et - verilerdeki en yaygın hataları tespit etmek ve genellikle hızlı hesaplamak için tasarlanmıştır (hızlı veri akışlarını etkili bir şekilde sağlama toplamı için).

Uygulamada, aynı işlevler genellikle her iki amaç için de iyidir. Özellikle, kriptografik açıdan güçlü bir karma kod, hesaplama maliyetini karşılayabiliyorsanız, iyi bir sağlama toplamıdır (rastgele bir hatanın güçlü bir karma işlevini bozması neredeyse imkansızdır).


1
Ayrıca, karma kodların kriptografik olmayan sürümünün, hesaplama süresi (CRC'ye yakın) ve ister kasıtlı olsun ister sadece iletişim hatası / bit çürümesi olsun (CRC'nin kasıtlı kurcalamayı tespit etmesi beklenemez, çünkü) kasıtlı olarak bir çarpışmayı tasarlamak nispeten kolaydır).
titiz

1
Bana göre, cevabınızdaki anahtar kelime, sağlama toplamının en yaygın hataları tespit etmek için tasarlanmış olmasıdır . Evet, bu o. verilerin olası bozulmaları için farklı değerler vermek üzere seçilmiş bir karma algoritmadır . Bu belirli bir amaçtır ve kişinin ilgilendiği karışıklık türlerine bağlı olarak bunu optimize eden belirli algoritmalara götürür.
ToolmakerSteve

22

Gerçekten de bazı farklılıklar var:

  • Giriş farklı olduğunda (mümkün olduğunca sık) sağlama toplamlarının farklı olması gerekir, ancak neredeyse hesaplamanın hızlı olması kadar önemlidir.
  • Karma kodlar (hashtable'larda kullanım için) aynı gereksinimlere sahiptir ve ayrıca özellikle benzer girdiler için kod alanı boyunca eşit olarak dağıtılmalıdırlar.
  • Kriptografik karmalar, bir karma verildiğinden çok daha katı gereksinimlere sahiptir, bu karmayı üreten bir girdi oluşturamazsınız. Hesaplama süreleri ikinci sırada gelir ve uygulamaya bağlı olarak hash'in hesaplanmasının çok yavaş olması bile istenebilir (kaba kuvvet saldırılarıyla mücadele etmek için).

1
Sağlama toplamlarının farklı girdiler için farklı olmasının herhangi bir faydası olduğunu düşünmüyorum. Sadece bütünlüğü kontrol etmek içindir, hashing için değil.
user541686

1
@Mehrdad: Peki farklı girdiler için farklı sonuçlar almadan bütünlüğü kontrol etmeyi nasıl öneriyorsunuz?
Michael Borgwardt

Eee, belki de söylediklerimi yanlış anladım? "Olabildiğince" dediğiniz kısma atıfta bulunmuştum - Ben sadece onların tahmin edilemez veya hash'ler gibi "uzak" olmaları için hiçbir neden olmadığını söylüyorum. Giriş tipik bir değişikliğe uğradığında sağlama toplamında bir miktar değişiklik olduğu sürece , bu iyi bir sağlama toplamıdır. Bunu, aynı zamanda nesneleri kendi ortak alanlarına mümkün olduğunca eşit / rastgele / tahmin edilemez / "uzak" olarak dağıtma amacına sahip olan karmalarla karşılaştırın.
user541686

Sanırım "olabildiğince" ile kastettiğim şeyi yanlış anladınız - sadece çarpışmaların mümkün olduğunca nadir olması gerektiğini, elbette kaçınılmaz olsa da. İfadeyi değiştireceğim.
Michael Borgwardt

@Mehrdad - ilk başta bu bana mantıklı gelmedi. Bir sağlama yoksa değil olası sağlama değerler üzerinde iyi bir dağılıma sahip, yani araçlar (diğer sağlama için daha) çok daha fazla giriş değerleri için döndürülen bazı sağlama değerleri vardır. Ancak bu, sağlama toplamının kullanışlılığını azaltır? [Karışık verilerin aynı sonucu döndürme olasılığını artırır, değil mi?] Hmm, yanılıyorum, haklısınız: sağlama toplamı yalnızca olası karışıklıkları tespit etmede iyi olmalıdır . Bu, tüm değerler üzerinde eşit bir dağılım gerektirmeyebilir.
ToolmakerSteve

10

Karma kodlar ve sağlama toplamları, bir veri öğesinden kısa sayısal değer oluşturmak için kullanılır. Aradaki fark, veri öğesinde küçük bir değişiklik yapılsa bile bir sağlama toplamı değerinin değişmesi gerektiğidir. Bir karma değer için gereksinim yalnızca gerçek dünya veri öğelerinin farklı karma değerlere sahip olmasıdır.

Açık bir örnek dizelerdir. Bir dizenin sağlama toplamı her biti içermelidir ve sıra önemlidir. Öte yandan bir karma kod, genellikle sınırlı uzunlukta bir önekin bir sağlama toplamı olarak uygulanabilir. Bu, "aaaaaaaaaaba" nın "aaaaaaaaaaab" ile aynı hash yapacağı anlamına gelir, ancak karma algoritmalar bu tür çarpışmalarla başa çıkabilir.


Bu cevap benim için zili çalan cevap. Dolayısıyla veri bütünlüğü, bir hash'in odak noktası değildir.
truthadjustr

9

Wikipedia bunu iyi ifade ediyor:

Sağlama toplamı işlevleri, karma işlevler, parmak izleri, rasgeleleştirme işlevleri ve kriptografik karma işlevlerle ilgilidir. Bununla birlikte, bu kavramların her birinin farklı uygulamaları ve dolayısıyla farklı tasarım hedefleri vardır. Çek rakamları ve eşlik bitleri, küçük veri blokları (Sosyal Güvenlik numaraları, banka hesap numaraları, bilgisayar sözcükleri, tek baytlar vb.) İçin uygun olan özel sağlama toplamı durumlarıdır. Bazı hata düzeltme kodları, yalnızca yaygın hataları tespit etmekle kalmayıp, aynı zamanda belirli durumlarda orijinal verilerin kurtarılmasına da izin veren özel sağlama toplamlarına dayanır.


28
Bunu okuduktan sonra, hala farkın ne olduğunu merak ediyorum.
kirk.burleson

@ kirk.burleson - Aynı prensip olduklarını söyleyebilirim , ancak pratikte her zaman değiş tokuş yapılır . Farklı durumlarda, farklı ödünleşmeler geçerlidir, bu nedenle farklı yaklaşımlar kullanılır. İki farklı kelime olmasının gerçekten bir gerekçesi değil, sadece sağlama toplamları için iyi teknikler ararsanız, karma kodları aramaktan farklı bir algoritma seti bulabileceğinizi söylüyorum.
ToolmakerSteve

5

Bir sağlama toplamı, yanlışlıkla yapılan değişikliklere karşı koruma sağlar.

Kriptografik bir karma, çok motive olmuş bir saldırgana karşı koruma sağlar.

Kablodaki bitleri gönderdiğinizde, yanlışlıkla bazı bitlerin ters çevrilmesi, silinmesi veya takılması meydana gelebilir. Gönderici, alıcının bu gibi kazaları tespit etmesine (veya bazen düzeltmesine) izin vermek için bir sağlama toplamı kullanır.

Ancak, kablodaki mesajı aktif ve akıllıca değiştiren birinin olduğunu varsayarsanız ve bu tür bir saldırgana karşı korunmak istiyorsanız, bir kriptografik karma kullanın (hash'i kriptografik olarak imzalamayı veya ikincil bir kanalı veya benzeri bir şeyi görmezden geliyorum, çünkü soru bundan kaçış gibi görünmüyor).


3
"kriptografik karma", "karma" ve "sağlama toplamı" arasındaki karışıklığı artırır. "kriptografik sağlama toplamı" daha iyidir çünkü öyle değildir.
MarcH

5

Karma ve sağlama toplamları, her ikisi de bir dosyanın içeriğine dayalı bir değer oluşturmaları açısından benzer olsa da, sağlama toplamı oluşturmakla aynı şey değildir. Bir sağlama toplamı, verilerin bütünlüğünü doğrulamak (kontrol etmek) ve veri aktarım hatalarını tanımlamak için tasarlanırken, bir karma, verilerin benzersiz bir dijital parmak izini oluşturmak için tasarlanmıştır.

Kaynak: CompTIA ® Security + Ağ Güvenliğinin Temelleri Kılavuzu - Beşinci Baskı - Mark Ciampa - Sayfa 191


4

Bu günlerde bunlar değiştirilebilir, ancak önceki günlerde bir sağlama toplamı, tüm verileri toplayacağınız (genellikle bayt cinsinden) ve sonunda bu değerle birlikte bir baytı işaretleyeceğiniz çok basit bir teknikti .. o zaman umarım orijinal verilerden herhangi birinin bozuk olup olmadığını öğrenin. Kontrol bitine benzer, ancak baytlarla.


4

Karma kod ve sağlama toplamı işlevleri arasındaki fark, farklı amaçlar için tasarlanmış olmalarıdır.

  • Sağlama öğrenmek için kullanılır eğer girdi şey değişti.

  • Bir hash kodu bulmak için kullanılır eğer girdi herhangi bir değişiklik olmuş ve mümkün olduğunca bireysel karma-kod değerleri arasındaki çok "mesafe" olarak var.

    Ayrıca, bu kurala karşıt olarak, karma-kod değerlerinin ağaçları / kümeleri / kümelerini erken oluşturma yeteneği gibi, bir karma işlevi için başka gereksinimler de olabilir .

    Ve biraz paylaşımlı başlangıç ​​rasgeleleştirme eklerseniz, modern şifreleme / anahtar değişimi konseptine ulaşırsınız.


Olasılık Hakkında:

Örneğin, giriş verilerinin aslında her zaman değiştiğini varsayalım (zamanın% 100'ü). Ve 1 bitlik bir hash / checksum değeri üreten "mükemmel" bir hash / checksum fonksiyonunuz olduğunu varsayalım. Bu nedenle, rastgele girdi verileri için zamanın% 50'sinde farklı hash / checksum değerleri elde edeceksiniz.

  • Rastgele giriş verilerinizdeki tam olarak 1 bit değiştiyse, giriş verisi ne kadar büyük olursa olsun, zamanın% 100'ünü tespit edebileceksiniz.

  • Rastgele giriş verilerinizdeki 2 bit değiştiyse, "bir değişiklik" algılama olasılığınız 2'ye bölünür, çünkü her iki değişiklik de birbirini etkisiz hale getirebilir ve hiçbir hash / checksum işlevi, giriş verilerinde 2 bitin aslında farklı olduğunu algılamaz. .

    ...

Bu, giriş verilerinizdeki bit sayısı, hash / checksum değerinizdeki bit sayısından birkaç kat daha büyükse, farklı giriş değerleri için farklı hash / checksum değerleri elde etme olasılığınız azalır ve bir sabit .


2

Sağlama toplamı kelimesini , dosyanın veya verilerin bozuk olup olmadığını kontrol etmek için kullanılabilecek bir dosya veya veri parçası için oluşturulan koda (sayısal veya başka türlü) atıfta bulunurken kullanma eğilimindeyim . Karşılaştığım en yaygın kullanım, ağ üzerinden gönderilen dosyaların değiştirilmediğini (kasıtlı olarak veya başka şekilde) kontrol etmektir.


1
Sağlama toplamlarının tersine çevrilmesi zor olmadığından, bu, bir şeyin kasıtlı olarak değiştirilip değiştirilmediğini kontrol etmede iyi olmayacağını gösterir.
benblasdell

0

Redis küme veri parçalamasında, hash slothangi düğüme gideceğine karar vermek için a kullanır . Örneğin aşağıdaki modulo işlemini ele alalım:

123 % 9 = 6
122 % 9 = 5
141 % 9 = 6

6Farklı girişler arasında iki kez çıkageldi. Karmanın amacı, basitçe bir girdi değerini bir çıktı değeriyle eşlemektir ve benzersizlik anlaşmanın bir parçası değildir. Yani aynı çıktıyı üreten iki farklı girdi, karma dünyasında gayet iyi.

Öte yandan, bir sağlama toplamı, girişteki bir bit değişse bile çıkışı farklı olmalıdır çünkü amacı eşlemek değil, veri bozulmasını tespit etmektir. Dolayısıyla, aynı çıktıyı üreten iki farklı girdi bir sağlama toplamında kabul edilemez.


-4

Bir sağlama toplamı, basitçe veri alanından oring ile (mantıksal toplama, dolayısıyla toplam) oluşturulan bir sayıdır. Sağlama toplamı, üretildiği veri alanındaki herhangi bir bitin veya bit sayısının bozulmasını tespit etme yeteneğine sahiptir, yani tüm hataları kontrol eder, bunları düzeltemez. Sağlama toplamı bir karmadır çünkü sağlama toplamının boyutu orijinal veriden daha küçüktür. Evet, çarpışmalar yaşayacaksınız çünkü sağlama toplamı veri alanındaki bit konumuna hiç duyarlı değildir.

Döngüsel artıklık denetimi (CRC) oldukça farklı, daha karmaşık bir şeydir ve sağlama toplamı olarak adlandırılmaz. Oluşturulduğu veri alanında seçilen herhangi bir sayıda tek tek bozuk biti düzeltme kapasitesine sahip bir polinom serisinin uygulamasıdır. Bir CRC'nin oluşturulması, boyut olarak orijinal veri alanından daha büyük bir sayı ile sonuçlanır (sağlama toplamının aksine) - bu nedenle ad "artıklık" kelimesini ve hata düzeltme özelliği için ödediğiniz fiyatı içerir. Bu nedenle bir CRC bir karma DEĞİLDİR ve karıştırılmamalı veya bir sağlama toplamı olarak adlandırılmamalıdır, çünkü artıklık orijinal verilerin boyutuna zorunlu olarak eklenir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.