2011-09-22 16 views
5

acuerdo con este artículorepresentación de bytes en BINARY_CHECKSUM()?

http://decipherinfosys.wordpress.com/2007/05/18/checksum-functions-in-sql-server-2005/

dicen que

BINARY_CHECKSUM() devuelve el mismo valor si los elementos de dos expresiones tienen el mismo tipo y representación de bytes. Por lo tanto, “2Volvo director 20" y “30 3Volvo director" proporcionará el valor misma

mi pregunta es ¿qué se byte representation?

y por qué

SELECT BINARY_CHECKSUM('2Volvo Director 20' )// -1356512636 
SELECT BINARY_CHECKSUM('3Volvo Director 30' )// -1356512636 

da los mismos resultados?

el byte de '' es no como el byte de ''

Respuesta

5

No sé exactamente lo que significa que el artículo por ese fraseo, pero a partir de alrededor de google veo que un MVP de SQL Server ha realizado ingeniería inversa del algoritmo completo (por ejemplo, here) y otros han notado que el algoritmo tiene problemas extraños en torno a un ciclo de 16 caracteres. Tenga en cuenta que en esa muestra, los cambios se producen en la posición 1 y la posición 17:

SELECT BINARY_CHECKSUM('2Volvo Director 20' )-- -1356512636 
SELECT BINARY_CHECKSUM('3Volvo Director 30' )-- -1356512636 
--      123456789

que son 16, aparte - si el espacio se elimina por lo que los cambios se producen en las posiciones 1 y , se obtienen diferentes sumas de comprobación:

consenso
SELECT BINARY_CHECKSUM('2Volvo Director20' )-- 1257395465 
SELECT BINARY_CHECKSUM('3Volvo Director30' )-- 1257395480 
--      123456789

el Internet parece ser que la función hash ofrecido por BINARY_CHECKSUM es de baja calidad, y que se debe utilizar en HASHBYTES preferencia.

+0

entonces ... ¿por qué inventaron esto si no es exacto? o tiene algunos agujeros negros (el ciclo de 16 ') –

+0

Todos cometemos errores, incluso Microsoft :) En particular, crear funciones hash es extremadamente difícil, mientras que crear malas funciones hash es extremadamente fácil. Al menos [los documentos para 'CHECKSUM'] (http://msdn.microsoft.com/en-us/library/ms189788.aspx) dicen (básicamente)" no lo use ". – AakashM

+0

SELECCIONE BINARY_CHECKSUM ('fa') SELECCIONE BINARY_CHECKSUM ('dA') ambos producen los mismos valores ... 1537 – nav

Cuestiones relacionadas