Wie cast von unsigned long auf unsigned char*?
Ich versuche, hash eine unsigned long
Wert, aber die hash-Funktion nimmt ein unsigned char *
ab, wie Sie sich in der Umsetzung unten:
unsigned long djb2(unsigned char *key, int n)
{
unsigned long hash = 5381;
int i = 0;
while (i < n-8) {
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
hash = hash * 33 + key[i++];
}
while (i < n)
hash = hash * 33 + key[i++];
return hash;
}
Gibt es eine Möglichkeit, kann ich mein Ziel erreichen, vielleicht mit einer Besetzung zwischen den beiden?
reinterpret_cast, aber es ist hässlich. Was die hashing-Funktion ist char*?
es ist vielleicht nur mich, aber ich denke, dass es mehr Kontext ( dh mehr code ) in dieser Frage.
Es war nicht getaggt, wenn ich kommentiert 😉
aus einen Blick auf die Funktion, Sie besser hoffen, dass Ihre long ist 8 Byte lang. ansonsten verwenden Sie lange, lange. andernfalls erhalten Sie möglicherweise die Segmentierung Fehler
reinterpret_cast
ist C++, die Frage ist für C.es ist vielleicht nur mich, aber ich denke, dass es mehr Kontext ( dh mehr code ) in dieser Frage.
Es war nicht getaggt, wenn ich kommentiert 😉
aus einen Blick auf die Funktion, Sie besser hoffen, dass Ihre long ist 8 Byte lang. ansonsten verwenden Sie lange, lange. andernfalls erhalten Sie möglicherweise die Segmentierung Fehler
InformationsquelleAutor James | 2013-05-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellen Sie sicher, dass Sie alle 4 bytes, die durch die
p
oder was auch immer ist die Länge vonunsigned long
auf Ihrem system.Und auch, vergessen Sie nicht über das endian-Probleme! Sie erhalten möglicherweise unterschiedliche hashes für die 'gleichen' Daten auf verschiedenen Computern, wenn Sie keine swap-endian angemessen.
p ist ein Zeiger. Es weist auf das erste byte des long-Typ ohne Vorzeichen. In diesem Fall wird eine variable namens 'x'. Ich vermute, Sie haben eine Funktion, die eine usnigned char-pointer und einige Länge. Wenn das der Fall ist, die Länge sollte sizeof( usnigned lang) oder sizeof( x ).
Das ist, vorausgesetzt, die hash-Funktion nimmt eine mit null beendete Zeichenfolge als Eingabe. In der Regel, Hash-Funktionen nehmen einen parameter Länge und den Zeiger auf den Puffer, nicht ein null-terminated string.
Ich weiß nicht, ob jemand weiß, ob die Funktion erfordert einen null-Terminierung, da wir nicht gesehen haben, die Funktion noch. Ein "char *" bedeutet nicht immer string
InformationsquelleAutor user1764961
Technisch können Sie es erreichen mit:
Geist die üblichen Fallstricke, aber:
sizeof(object) > (int) sizeof(object)
(falls zutreffend auf Ihre Architektur(en)), Hinweis: Sie erhalten möglicherweise die out-of-bounds Zugriffe (Undefiniertes Verhalten) oder nur einen Teil Ihres Objekts Hash.sizeof x
stattsizeof(x)
ist noch seltener alsreturn(x)
stattreturn x
🙂Eine schlechte Angewohnheit, vielleicht. 🙂
Ich finde es eigentlich erfrischend 🙂
InformationsquelleAutor Michael Foukarakis
Als andere sagte, Sie können leicht Lesen, eine
int
oder jedes andere Objekt als einechar
array :Aber beachten Sie, dass
0xdead
gespeichertshort
oder einelong
nicht den gleichen hash.Beachten Sie auch, dass Sie Ihre hash-Funktion könnte besser sein, ausgerollt, mit einem Duff ' s device :
InformationsquelleAutor zakinster
Dies zeigt eine Besetzung arbeiten. Beachten Sie, dass in diesem Fall das "ABC" string null-terminiert, aber dies erfordert mehr Sorgfalt in der realen Welt Fällen
ABC
aber nur auf big-endian-Systeme. Edit: Tatsächlich, auf big endian Systemen, es würde nur ein leerer string.ja, es ist "CBA" hier auf einem typischen intel-Linux-system 🙂
InformationsquelleAutor Vorsprung
Seit Sie gepostet habe deinen code jetzt wollen Sie etwas ähnlich wie diese:
es noch Schleifen mit weniger als 8 Byte, sondern produziert speicherzugriffsverletzungen. so, es tut, erwartet einen Puffer der Größe % 8 == 0
Schauen Sie näher, es wird nicht die Schleife, wenn Größe < 8.
ja habe ich, du hast Recht. aber es kann immer noch produzieren die Segmentierung Fehler bei der Größe % 8 != 0
ugh, ja, du hast Recht. Ich glaube, ich sollte testen, meine Vorschläge oft mehr. Ich habe immer noch glaube, dass die erste while-Schleife ist unnötig
InformationsquelleAutor tangrs
Sollten Sie wandeln es mit ultoa_s
Kannst du nicht konvertieren, ulong, um eine null-terminierte Zeichenfolge und verwenden Sie den Zeiger?
Wie erwarten Sie, dass
0x10000010
Aussehen wie eine 0-terminierte Zeichenkette?Sie haben vermutet, dass char * ist ein string, und es könnte nicht sein. Sie haben auch zeigte der Benutzer eine Funktion, konvertiert einen ulong in eine string-Darstellung einer Zahl - das ist nicht Gießen
Sie sind richtig, char* bedeutet nicht, es ist eine Zeichenfolge erforderlich.
InformationsquelleAutor dizzer