Welcome to GASP Sign in | Join | Help

Paulo Morgado

Tudo sobre Arquitectura de Software
Obtendo O Código Hash De Uma String Do CLR .NET 1.1 Usando O CLR .NET 2.0

Todos sabemos (ou deveríamos saber) que os valores obtidos do método GetHashCode não devem ser persistidos para uso posterior, especialmente com strings, porque:

O comportamento de GetHashCode é dependente da sua implementação, que pode variar de uma versão do Common Language Runtime para para outra. A razão porque isto pode acontecer pode ser para melhorar a performance de GetHashCode. [^]

No entanto, código que persiste valores obtidos do método GetHashCode para uso posterior pode cair no nosso colo. E se for necessário actualizar o nosso código para, por exemplo, usar WCF ou WF, temos um problema.

A solução seria usar o Reflector para ver como isto é feito no CLR 1.1 e implementar o mesmo algoritmo no CLR 2.0.

Infelizmente, a implementação no 1.1 é em código nativo.

Hoje, graças à Nicole, encontrei a classe System.Collections.Specialized.BackCompatibleStringComparer no CLR 2.0. Esta classe implementa o algoritmo  do String.GetHashCode do CLR 1.1 e pode ser encontrado nas assemblies System.dll e System.Windows.Forms.dll. Não podemos usá-lo porque é interno, mas podemos usar o Reflector para ver a sua implementação. Também pode ser encontrado aqui.

Agora tenho algumas questões:

  • Porque é que esta classe está replicada em duas assemblies?
  • Porque é que está a ser usada na classe DataObject?
  • Porque é que é interna?
  • Porque é que está a ser usada na Enterprise Library? [^][^]
Posted: Friday, May 30, 2008 1:23 AM by Paulo Morgado

Comments

No Comments

Leave a Comment

(required) 

(required) 

(optional)

(required) 

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS