2008-08-19 18 views

cevap

4

Sen bir değişiklik olmadan neredeyse C kodu alabilir:

uint sdbm(string str) 
{ 
    uint hash = 0; 
    foreach(char ch in str) 
    { 
     hash = ch + (hash << 6) + (hash << 16) - hash; 
    } 
    return hash; 
} 

Yoksa daha sofistike bir şey düşündünüz?

1
Bir C derleyicisi bu yüzden aynı gerçekleştirir olmadığını görmek için test edemez kurdunuz yok, ama ben şu doğrudur düşünüyorum

:

private static ulong SBDM(string str) 
{ 
    ulong hash = 0; 

    foreach (char c in str) 
    { 
     hash = c + (hash << 6) + (hash << 16) - hash; 
    } 

    return hash; 
} 

sadece gerekiyorsa dize bir karma olsun ve çok fazla önemli değil, uygulama her zaman theString.GetHashCode();

0

Karmadan elde edilen sonuç C++ ve C# uygulamaları arasında farklılık gösterir. Bu str parametresinin bayt dizisi olarak geçirilmesi gerektiğini anladım. değeri dönüştürerek yöntem

private uint sdbm(byte[] str) 
{ 
    uint hash = 0; 

    foreach (char ch in str) 
     hash = ch + (hash << 6) + (hash << 16) - hash; 

    return hash; 
} 

Çağrı BitConverter.GetBytes yöntemi ile karma edilmesi.

uint Hash = sdbm(BitConverter.GetBytes(myID));