Tam olarak (ve tam olarak) “karma” nedir?


38

“Karma” kelimesinin farklı bağlamlarda (bilgisayar dünyasının tümü içinde) farklı anlamlarla kullanıldığını duydum. Mesela, Python'u Zor Yoldan Öğrenin kitabında , sözlükler bölümünde "Python onları çağırır" denir. Diğer diller ise bunları "hashlar" olarak adlandırır.

Sözcüğün diğer yaygın kullanımı şifreleme ile ilgilidir. Ayrıca "hash" kelimesini yüksek seviye programlamada özel bir fonksiyon olarak kullanan (& okuyan) insanlar da duydum.

Peki tam olarak nedir?

Herkes (zaman içinde ve bilgili olan) nazikçe "hash (veya hash)" un gritini açıklayabilir mi?


8
Wikipedia'da karma tablolar ve şifreleme karma işlevleri hakkında ayrıntılı makaleler var . Aradığın şey bunun içinde değil mi?
David Richerby

1
Zaten "karma" teriminin çoklu kullanımlarını listeliyorsunuz ve dahası da var. Öyleyse, "tam olarak nedir?" E tam olarak nasıl cevap vermeyi umuyorsunuz?
Raphael

4
Bu anlamda "Hashes", "Hash tabloları" nın kısaltılmasıdır, örneğin anahtarların düzenlenmesi için hash kullanan tablolar. Benzin "gaz" demeye benziyor - "gaz" ın gaz olmasını ya da gazların benzin benzeri özelliklere sahip olmasını beklemiyorsunuz, değil mi? Bu her zaman dil ile olur - özellikle kısalması çok yaygın kelime örtüşme kaynaklarıdır.
Luaan

1
“Bu kelimenin tanımı yok - hiç kimse ne olduğunu bilmiyor.” - Şeytanın Sözlüğü
jpmc26

Hash fonksiyonunun ne olduğu farklı düşünce tarzları: bir hash fonksiyonu sadece birtakım özelliklere sahip olan bir fonksiyondur, ancak bunun ne kadar alakalı olduğu değil, hangi özelliklere sahip olmasını istediğimiz - istediğimizden türetilen işlevi kullanmak için - bu uygun. Maddelere hızlıca erişmek için kullanmak istediğimiz için, verimli bir şekilde hesaplanabilir olmasını istiyoruz. Sınırsız alanımız olmadığı için, alan adının sınırlı olmasını istiyoruz. Çarpışmaları olabildiğince iyi önlemek istediğimiz için, hash fonksiyonunun hashları eşit şekilde yaymasını istiyoruz.
G. Bach

Yanıtlar:


44

Hash fonksiyonlarında Wikipedia makalesi çok iyi, ama burada benim vereceğim.


Bir karma nedir?

"Hash", farklı bağlamlarda farklı biçimsel anlamlara sahip gerçekten geniş bir terimdir. Sorunuza mükemmel bir cevap yok. Genel temel kavramı açıklayacağım ve terimin en yaygın kullanımlarından bazılarından bahsedeceğim.

h

  1. Hesaplanması kolay olmalı ve
  2. Çıktılar nispeten küçük olmalıdır.

Örnek:

Diyelim ki 0 - 999,999,999 - 0 - 99 aralığındaki sayılara sahip olmak istiyoruz. Basit bir karma işlevi .h(x)=xmod100

Ortak ek özellikler:

Kullanım durumuna bağlı olarak, karma işlevinin ek özellikleri sağlamasını isteyebiliriz. İşte bazı yaygın ek özellikler:

  1. Tekdüzelik : Genellikle, nesnelerin hashlerinin belirgin olmasını isteriz. Dahası, karmaların "yayılmasını" isteyebiliriz. Eğer bazı nesneleri 100 kovaya sokmak istersem (bu yüzden, hash fonksiyonumun çıktısı 0-99 arasında bir sayıdır), o zaman genellikle umarım yaklaşık 1/100 nesnenin 0 kovada, yaklaşık 1/100 arazide toplandığını umuyorum. kova 1, vb.

  2. Kriptografik çarpışma direnci : Bazen bu daha uzak bir noktadan alınır, örneğin kriptografide, bir rakip için aynı çıktıya eşlenen iki farklı girdiyi bulmak için hesaplamalı olarak zor olan bir karma işlevi isteyebilirim.

  3. Sıkıştırma : Genellikle, sabit boyutlu bir çıktıya ya da sabit sayıda kovaya keyfi büyüklükte girdiler elde etmek isterim.

  4. Determinizm : Çıkışı çalıştırmalar arasında değişmeyen bir karma işlevi isteyebilirim, yani aynı nesnedeki karma işlevinin çıkışı her zaman aynı kalır. Bu yukarıdaki tekdüzelik ile çakışıyor gibi görünebilir, ancak bir çözüm karma işlevini rastgele bir kez seçip koşular arasında değiştirmemektir.


Bazı uygulamalar

Yaygın olarak kullanılan uygulamalardan biri, sözlükleri uygulamanın bir yolu olan karma tablo gibi veri yapılarındadır. Burada, bir miktar bellek ayırıyorsunuz, diyelim ki, 100 "kova"; daha sonra, sözlükte bir (anahtar, değer) çifti saklamanız istendiğinde, anahtarı 0-99 arasında bir sayıya getirir ve çifti, ilgili kovada bellekte saklarsınız. Ardından, bir tuşa girmeniz istendiğinde, aynı karma işlevine sahip anahtarı 0-99 arasında bir sayıya getirin ve o anahtarın içeride olup olmadığını görmek için bu kovayı kontrol edin. Öyleyse, değerini döndürürsünüz.

Sözlükleri ikili arama ağacı gibi başka nesnelerle de uygulayabileceğinizi unutmayın (nesneleriniz karşılaştırılabilirse).

Diğer bir pratik uygulama, iki dosyanın aynı olup olmadığını kontrol etmenin yolları olan sağlama toplamlarıdır (örneğin, dosya önceki sürümünden bozulmuş değildi). Karma işlevleri, iki girişi aynı çıktıya eşlemek için pek olası olmadığından, genellikle bir dize olarak gösterilen ilk dosyanın bir hastasını hesaplar ve saklarsınız. Bu karma çok küçük, belki sadece birkaç düzine ASCII karakter. Ardından, ikinci dosyayı aldığınızda, hash ve çıktının aynı olup olmadığını kontrol edin. Eğer öyleyse, neredeyse kesinlikle byte-forte için de aynı dosya.

Başka bir uygulama, bu karma değerlerin "tersine çevrilmesinin" zor olduğu kriptografidedir - yani, çıktı ve karma işlevi göz önüne alındığında, bu çıktıya yol açan girdi (ler) i hesaplamak zor hesaplamalıdır. Bunun bir kullanımı şifrelerdir: Şifreyi kendisinin saklamak yerine, şifrenin şifreli bir şifresini saklarsınız (belki bazı diğer içeriklerle birlikte). Ardından, kullanıcı bir şifre girdiğinde, karma değerini hesaplar ve doğru karma ile eşleştiğini kontrol eder; öyleyse, şifrenin doğru olduğunu söylüyorsunuz. (Şimdi, sunucuda kaydedilen hash'ı arayabilen ve bulabilen bir kişi bile, kullanıcı gibi davranarak bu kadar kolay bir zamana sahip değildir.) Bu uygulama, çıktının girdiden çok uzun veya daha uzun olduğu durumlarda olabilir. giriş çok kısa.


1
Güzel bir açıklama ama "çok düşük" ile aynı fikirde değilim. : Bkz programmers.stackexchange.com/questions/49550/... çarpışma: do bazen şaşırtıcı sık sık meydana gelir ve.
Olivier Dulac

8
Ayrıca, kiptografi bağlamında, "karma" teriminin, pratikte kolayca geri çevrilemeyen "tek yönlü" bir işlemi çok güçlü bir şekilde ima ettiğini unutmayın. Kolayca tersine çevrilebildiğinde, buna "şifreleme" denir. Bu yüzden Security.SE'deki insanlar size her zaman müşterilerinizin şifrelerini, asla şifrelemelerini sağlamalarını söyleyecektir.
Ixrec

4
"Yayılmayan" bir karma hala bir karma, uygulamanız için belki de çok iyi değil.
Dur zarar Monica

1
Tabii, bunların hepsi iyi nokta.
usul

10

Bir hızlı arama fonksiyonu , bir girdi alır ve sabit boyutta bir değeri üreten bir fonksiyonudur. Örneğin , herhangi bir uzunluktan birini stringHashkabul eden stringve 32 bit bir tam sayı üreten bir karma işleviniz olabilir .

Genellikle bir karma işlevinin çıktısının bir karma (karma değeri veya karma toplamı olarak da bilinir) olduğunu söylemek doğrudur . Ancak, bazen insanlar işlevin kendisine bir karma olarak bakarlar . Bu teknik olarak yanlıştır, ancak genellikle kişinin hash işlevi anlamına geldiği (bağlamda) anlaşıldığı gibi göz ardı edilir .

Bir karma işlevinin tipik kullanımı, bir karma tablosu uygulamaktır . Karma tablo, değerleri genellikle anahtar olarak adlandırılan diğer değerlerle ilişkilendiren bir veri yapısıdır. Bunu, sakladığı verilerin hızlı bir şekilde aranması için kullanabileceği sabit boyutlu bir karma değeri üretmek için anahtar üzerindeki bir karma işlevini kullanarak yapar. Bunu nasıl yaptığını tam olarak ele almayacağım, ama buradaki asıl gerçek, bir karma tablosu olarak adlandırılmasıdır, çünkü karma değerleri (karma) üretmek için bir karma işlevine dayanır .

Bu, bazı karışıklıkların gerçekleştiği yerdir, çünkü bazı insanlar (yine biraz yanlış), bir karma tablosuna karma olarak işaret eder . Diğer cevaplar da belirtildiği üzere, bazen belirli bir dilin uygulanması karma tabloya atıfta karma tablo bir şekilde karma (ı diğer diller de yapmak bekliyoruz gerçi özellikle Perl, bunu yapar). Diğer diller, bir karma tablo uygulamasına sözlük olarak bakmayı tercih eder . Python bu dillerden biridir, ancak dillerinde ne kadar kökleşmiş olduklarından dolayı, birçok Python kullanıcısı sözlük terimini 'dict' olarak kısaltır.

Terim doğru kullanımı iken Yani karma başvurmaktır karma değeri bir tarafından üretilen karma işlev , insanlar da bazen başvurmak için gayri terimini kullanmak hash fonksiyonları ve karma tabloları dolayısıyla karışıklığı yaratarak.


2
Bir karma tablosuna ya da karma işlevine "karma" olarak başvurmanın gerçekten yanlış olduğundan emin değilim (örneğin, "ABD" anlamına gelen "Washington" u kullanmaktan daha kötüsü görünmüyor). Washington, Çin'in ifadesini temkinli bir şekilde karşıladı "). Fakat kafa karıştırıcı olduğuna katılıyorum ve cevabınızdaki konuda çok net olmanız iyi.
David Richerby

1
@DavidRicherby Resmen, "karma" eserinin tanımsız olduğunu söyleyebilirim. "Hash işlevi", "hash değeri", "hash tablosu" ve "bir dizge için" tümü kesin matematiksel tanımlara sahiptir, ancak "karma" belirsizdir. Benzer şekilde, "Washington" ile neyi kastettiğinizi de biliyorum, ancak cümleniz "Washington" u "gayriresmi bir yol" olan "Washington City" veya "Denzel Washington" anlamına geldiğinde Federal hükümete atıfta bulunmak. Alt satır: sıkı bir resmi tanım için "ne demek istediğini bilmek" i karıştırmamaya dikkat edin.
Mike Ounsworth

@DavidRicherby Bu gerçekten eşdeğer bir benzetme değil. Yanlışlık tartışmalıdır ancak kayıt dışılık değildir.
Pharap

2

Bir karma işlevi genel olarak görüntünün etki alanından daha küçük olduğu her işlevdir . Böyle bir işlevin çıktısı f(x)"hash" olarak adlandırılabilir x.

Bilgisayar bilimlerinde genellikle karma fonksiyonların iki uygulamasıyla karşılaşırız.

Birincisi , anahtar etki alanını (örn. 32 bit tam sayılar veya isteğe bağlı uzunluktaki dizeler) bir dizi dizinine (örneğin 0 ile 100 arasında tam sayı) eşlemek istediğimiz karma tablolar gibi veri yapıları içindir . Buradaki amaç veri yapısının performansını en üst düzeye çıkarmak; hash fonksiyonunun tipik olarak istenen özellikleri, basitlik ve düzgün çıktı dağılımıdır.

Perl, ilişkisel ilişkisel dizi türünü "karma" olarak adlandırır ve bu durum kafanızdaki kargaşaya neden olur. Bunu yapan başka dil bilmiyorum. Gevşek bir şekilde veri yapısı bir hash fonksiyonunun kendisi olarak görülebilir (alanın mevcut anahtarlar dizisidir), fakat aynı zamanda bir karma tablo olarak uygulanır.

İkincisi kriptografi içindir : mesaj doğrulama, şifre / imza doğrulama, vb. Alan adı genellikle rastgele bayt dizeleridir. Burada, yararlı özelliklerin çarpışma ve görüntü önleme direnci olduğu durumlarda - bazen kasıtlı olarak düşük performans anlamına gelen - güvenlikle ilgileniyoruz.


Ve hala ilk cümleye itirazım var çünkü SHA-512 ile 32 karakterlik şifreler kullanıldığında, giriş alanı aslında çıktı alanından daha küçük. Karma zincirleme birlikte çalıştığında, alan ve aralık aynıdır; giriş alanının boyutu anlamsızdır. Pharap'ın cevabı doğru tanımı var: "Bir karma fonksiyonu, sabit uzunluklu çıktıya sahip herhangi bir fonksiyondur". İşte bu, ihtiyacın olan bu, konuştuğun diğer şartlar bundan bahsediyor.
Mike Ounsworth

@MikeOunsworth, ancak SHA-512'nin alanı, keyfi uzunluktaki ikili dizelerdir. Sanırım Firavun ifadelerini çalabilirim, ancak OP'nin faydası için şartları açıkça ortaya koymaya çalışıyordum. Aslında "sabit uzunluk" un gerekli olduğundan veya net olarak tanımlanmadığından emin değilim.
Dur zarar Monica

@OrangeDog Tamam, ancak SHA-512'yi MikesHash(), uzunluğu 12 olan dizeleri kabul eden ve bunları SHA-512'ye ileten ve çıktıyı döndüren bir fonksiyonun içine sarabilirim . MikesHash()Hala bir karma işlevinin tanımına uyduğundan eminim . (Pratikte haklısın, kullandığımız karma işlevleri isteğe bağlı uzunluktaki girdileri kabul ediyor, ancak yapmazsa bir şeyin karma işlevi olmadığını düşünmüyorum.)
Mike Ounsworth

@MikeOunsworth eşit olarak, eğer msb bir ise, çıktının kesilmesi veya dolgusu olacak şekilde sarın. Çıktı artık sabit uzunlukta değil, ancak yine de bir karma işlevi var mı?
Dur zarar Monica

@OrangeDog Hayır derdim. Baştan beri benim açımdan bir karma işlevinin sabit boyutlu bir çıktıyla eşleşmesi gerektiği, ancak girdi boyutunun alakasız olduğu yönünde olmuştur. Çok konu dışı kaldık. Cevabınız içinde iyi şeyler var, sadece resmi tanımınıza dikkat edin ;-)
Mike Ounsworth

0

Büyük soru Basil Ajith,

İşte bugün üzerinde çalışıyorum bir şey için bir karmaşanın ne olduğuna dair bakış açım.

*

Tarball’ın indirme sayfasına uygun olduğunu doğrulamak için kontrol toplamını kullanın.

*

görüntü tanımını buraya girin Denetçi şapkası takıyor, demek istediğim sihirbaz bornoz

karma bir değer / string / whatever / label olduğundan, makinenizde indirme kaynağı ile aynı olduğundan emin olun.


3
Bu bir karma için sadece bir kullanımdır. Başka birçok kullanım var.
Yuval Filmus

Siteye Hoşgeldiniz! Kriptografik karma değerlerin sağlama toplamı olarak kullanılması zaten kabul edilen yanıtın kapsamına girmiştir, bu nedenle yanıtınız çok fazla ekran alanı kaplarken yeni bir şey eklemiyor.
David Richerby

-1

Sadece diğerlerinin söylediklerinin kısa bir özetini eklemeye çalışacağım.

Özet fonksiyonu

Karma işlevler adı verilen özel bir işlev türü vardır.

"SHA256, kriptografik olarak güvenli olan iyi bilinen bir karma işlevidir"

Üç ana uygulama * hash tabloları, * sağlama toplamları (örneğin, sabit sürücülerde veya ADSL protokollerinde veri bütünlüğü kontrolü), * ve şifrelemedir (dijital imzalar ve güvenli parola depolaması dahil ancak bunlarla sınırlı olmamak üzere çeşitli şifreleme kimlik doğrulama formları).

Karma tablo

Karma tablo, hızlı arama için bir veri yapısıdır. Dahili olarak hash işlevlerini kullanır, dolayısıyla adı kullanır.

"Veritabanları, arama isteklerinin yürütülmesini hızlandırmak için dahili olarak tabloları ve arama ağaçlarını kullanır"

esrar

  1. sözlük soyut veri türü

"Hash", Perl'deki yerleşik sözlüklerin resmi adıdır. Bunlar dahili olarak karma tablolardır, dolayısıyla adıdır. Msgstr "Bu alt yordam, ilk argüman olarak bir karma kabul ediyor". Bu günler, mutlaka bir karma tablo değil, herhangi bir ilişkisel dizi için kullanılabilir.

  1. bazı girişlere bir karma işlevi uygulama sonucu

".İso görüntülerinin MD5 karmaları indirdikten sonra bütünlüklerini kontrol etmek için sağlanmıştır".

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.