sdbm
karma işlevi (this gibi) C# nasıl uygulanır?Bir sdbm karma işlevi C# nasıl uygulanabilir?
3
A
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));