2016-06-04 14 views

Odpowiedz

8
  1. Specyfikacja języka nie mówi, co oznacza, że ​​można ją dowolnie zmienić w dowolnym momencie lub różnić się między implementacjami.

  2. Algorytm mieszania różni się nieco między typami i platformami. Jak na razie: na architekturze x86 (32 lub 64-bitowej), jeśli procesor obsługuje instrukcje AES, środowisko wykonawcze używa aeshash, hasha zbudowanego na prymitywach AES, w przeciwnym razie wykorzystuje funkcję "zainspirowaną" przez xxHash i cityhash, ale różni się od nich. Istnieją różne warianty dla systemów 32-bitowych i 64-bitowych. Większość typów używa prostego skrótu do zawartości pamięci, ale typy zmiennoprzecinkowe mają kod, który zapewnia, że ​​zarówno 0, jak i -0 mieszają się równomiernie (ponieważ porównywane są w równym stopniu) i NaNs mieszając losowo (ponieważ dwa NaN nigdy nie są równe). Ponieważ typy złożone są zbudowane z elementów pływających, ich skróty składają się z skrótów dwóch części zmiennoprzecinkowych. A hash interfejsu to skrót wartości przechowywanej w interfejsie, a nie sam nagłówek interfejsu.

  3. Wszystkie te rzeczy są w prywatnych funkcjach, więc nie, nie możesz uzyskać dostępu do wewnętrznego skrótu Go dla wartości we własnym kodzie.
+0

W jaki sposób powstają haszowniki? Czy zawiera on strukturę treści jako jedną liniową porcję pamięci? A co ze strunami? Czy zawiera on dane ciągów lub wewnętrzną reprezentację struktury, która jest wskaźnikiem i długością? Czy skrót dwóch ciągów, które przechowują tę samą sekwencję bajtów, ale w innej lokalizacji skutkuje równymi lub nierównoległymi skrótami? – thomasrutter

+0

@thomasrutter jeśli dwie rzeczy porównywane są z '==' muszą mieć równe skróty (lub mapy nie działałyby ... to jest również uzasadnienie wszystkich specjalnych przypadków, które opisałem powyżej). Oznacza to, że struny zawierają ich ciała, a nie ich nagłówki. Struktury tworzą skróty wszystkich ich pól. Nie mogę znaleźć kodu faktycznie implementującego to, ale testy i [zasady porównania] (https://golang.org/ref/spec#Comparison_operators) wyjaśniają to. – hobbs

+0

Dzięki za link – thomasrutter

3

Implementacja mapy Go używa skrótu o nazwie aeshash. To nie jest AES, ale do obliczania skrótów używa instrukcji montażu aesenc. Ten skrót nie jest eksportowany do użycia w bibliotece standardowej.

Sama mieszanka jest zapisana w zestawie i można ją znaleźć w źródle pakietu środowiska wykonawczego.