Hash

雜湊函式可以接受固定大小的輸入嗎?

  • February 17, 2021

我和一個朋友爭論了很長時間,這個 C# 方法是否可以被限定為雜湊函式。

public override int GetHashCode() {
   return X.GetHashCode() * 31 + Y.GetHashCode();
}

我的論點是,這只是返回一個 32 位整數值,使用 2 個可變 32 位整數值(和一個常數 32 位整數值)的固定輸入大小,而散列函式的先決條件之一是任意輸入大小。據我所知,使用兩個 32 位整數輸入並不是任意的。除非任意指的是一般的可能性(意味著 2 個不同的函式可以具有固定大小的輸入,但具體大小不受限制,並且每個函式可能不同)並且不需要每個函式都能夠接受任意輸入大小,同時返回相同大小的輸出,無論輸入大小如何。

X.GetHashCode() 和 Y.GetHashCode() 的值是可變的 32 位整數值,是雜湊函式的結果。

現在,按照我的看法,您可以將該程式碼簡化為: h(x, y)=x*31+y ,其中 x 和 y 是 32 位整數值。這給你留下了 64 位固定輸入大小,所以要麼我的簡化有問題,要麼它不是雜湊函式,對嗎?

如果這種簡化不正確,為什麼不呢?

究竟是什麼將其排除/限定為雜湊函式?

作為雜湊函式結果的輸入值是否會以任何方式影響程式碼作為雜湊函式的資格?即使保證輸入將是散列函式的結果,這也不會使該函式成為散列函式,對嗎?(就像 ‘f(log2(4), log2(3)) 一樣,其中 f(x, y) = x+y’ 不會僅僅因為輸入而成為對數函式。)

感謝您的時間。任何建議都非常感謝。另外,如果某些部分不清楚或格式不正確,請見諒。我並不真正精通這一點,無論是數學定義、語言還是一般的 stackexchange。

C#/.NET GetHashCode() 不是加密雜湊函式。作為一個非加密雜湊函式,我認為假設 X 和 Y 是構成對象的唯一“公共”屬性,您所寫的內容是合理的。

話雖如此,加密散列函式在實現和目的上都與 C#/.NET/Java 散列碼以及其他語言非常不同,因此您可能希望將這個問題帶到更合適的場合。

引用自:https://crypto.stackexchange.com/questions/88291