Just nu i M3-nätverket
Gå till innehåll

Från C# till VB.NET


Artem Los

Rekommendera Poster

Hej,

 

Jag har försökt att göra om en kod skriven i C# till VB.NET men det verkar inte fungera.

Här nedan är original koden: från: källa

static public int GetStableHash(string s)
          {
              uint hash = 0;
               // if you care this can be done much faster with unsafe 
               // using fixed char* reinterpreted as a byte*
               foreach (byte b in System.Text.Encoding.Unicode.GetBytes(s))
               {

                   hash += b;
                   hash += (hash << 10);
                   hash ^= (hash >> 6);

               }
               // final avalanche
               hash += (hash << 3);
               hash ^= (hash >> 11);
               hash += (hash << 15);
               // helpfully we only want positive integer < MUST_BE_LESS_THAN
               // so simple truncate cast is ok if not perfect
               return (int)(hash % MUST_BE_LESS_THAN);
          }

 

Här är min version av koden i Visual Basic.NET

    Const MUST_BE_LESS_THAN As Integer = 100000000

   Function GetStableHash(ByVal s As String) As Integer


       Dim hash As UInteger = 0

       For Each b In System.Text.Encoding.Unicode.GetBytes(s)
           hash += b
           hash += (hash << 10)
           hash = hash Xor (hash >> 6)
       Next

       hash += (hash << 3)
       hash = hash Xor (hash >> 11)
       hash += (hash << 15)

       Return Int(hash Mod MUST_BE_LESS_THAN)
   End Function

 

Då jag kör koden i VB.NET, leder det till ett fel i For Each

hash += (hash << 10)

, nämligen overflow...

 

Tack på förhand,

Artem

Länk till kommentar
Dela på andra webbplatser

Har märkt att det går att ändra lite. Dock är det fortfrande en skillnad i resultatet.

    Function GetStableHash2(ByVal s As String) As Integer


       Dim hash As UInteger = 0

       For Each b In System.Text.Encoding.Unicode.GetBytes(s)
           hash += b
           hash <<= 10
           hash = hash Xor (hash >> 6)
       Next

       hash <<= 3
       hash = hash Xor (hash >> 11)
       hash <<= 15

       Return Int(hash Mod MUST_BE_LESS_THAN)
   End Function

koden fungerar i alla fall!

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...