Documentacao HASH

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

hrodrigom
Usuário Nível 2
Usuário Nível 2
Mensagens: 63
Registrado em: 10 Nov 2007 08:04
Localização: Santa Rita - Paraguay

Documentacao HASH

Mensagem por hrodrigom »

Boa Tarde pessoal,

Eu tinha uma rotina que em alguns clientes pela quantidade de dados tomava
os inaceitaveis 12 minutos para conclusao.

Resolvi estudar como funciona o HASH e consegui implementar algo que me
deixou maravilhado, baixei esse tempo para 7 seguntos simplesmente criando
uma especie de INDICE em hash para meu array.

Agora pergunto, existe alguma documentacao em portugues ou espanhol sobre
hash.
ja esta sendo de grande ajuda /xharbour/doc/hash.txt.

Mas eu gostaria de uma explicacao mais do meu nivel sobre hash,
quais seriam as aplicacoes possiveis?
Posso trocar meus array por hash, ou nao tem nada a ver.

Hoje ja entendi como funciona

hTeste[1] := 10
hTeste[2] := 20

depois obtenho estes valores, tambem ja consigo testar se uma chave existe
ou nao.. até ai blz..

Mas existe hash multicolunar.. tipo num array.. e se tiver, tem como fazer
um scan dentro de uma destas colunas assim como faço aScan com array. e a
velocidade?

Estou boiando, ou é por ai o caminho?

Grato por qualquer informação.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Documentacao HASH

Mensagem por Maligno »

hrodrigom escreveu:existe alguma documentacao em portugues ou espanhol sobre hash.
ja esta sendo de grande ajuda /xharbour/doc/hash.txt.
Você não especifica sobre qual hash está falando. Existem vários algoritmos. Se quiser o MD5, visite a página sobre ele na Wikipedia. Mas a melhor documentação está em inglês (não adianta querer fugir da língua inglesa - na nossa área, o que há de melhor está em inglês).
Mas eu gostaria de uma explicacao mais do meu nivel sobre hash,
quais seriam as aplicacoes possiveis?
Posso trocar meus array por hash, ou nao tem nada a ver.
Hash, genericamente falando, é um algoritmo que serve para criar uma "impressão digital" de um conjunto de dados. Dentro dessa característica, que é a única, você cria aplicabilidade para ele. Daí você decide se precisa CRC32, MD5, SHA1, etc, conforme a necessidade de segurança.
Estou boiando, ou é por ai o caminho?
Eu que fiquei boiando. Não consegui entender pra qual situação você precisa de um hash. Em que situação você usou um hash, que resolveu seu problema com índice? Ou ainda, qual é o problema que você precisa resolver, especificamente?
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
hrodrigom
Usuário Nível 2
Usuário Nível 2
Mensagens: 63
Registrado em: 10 Nov 2007 08:04
Localização: Santa Rita - Paraguay

Re: Documentacao HASH

Mensagem por hrodrigom »

Maligno escreveu: Mas a melhor documentação está em inglês (não adianta querer fugir da língua inglesa - na nossa área, o que há de melhor está em inglês).
Concordo.
O que eu gostaria era de ter algum material que explicasse melhor o uso deste tipo de dados. Pois a documentacao explica muito bem (EM INGLES) como manipular estes dados.
Maligno escreveu: Não consegui entender pra qual situação você precisa de um hash.
Desculpa, acho q nao consegui me expresar bem.
Para explicar melho que tipo de hash eu estou falando vc poderia ver a documentacao do xharbour
xharbour/doc/hash.txt
ou um exemplo
xharbour/tests/hash.prg

Mas vou tentar me expresar melhor:
Hash no xHarbour pelo que entendo é um tipo de dados, me parece semelhante com arrays, mas muito mais rapido, e com possibilidade de manipular com sintaxe oop.

Na verdade ate ai blz, ja consegui ate dar um uso pratico para este tipo de dados.
Eu criei um hash e para cada chave eu coloquei um valor. o mesmo eu tinha antes em um array, mas o aScan era muito lento.

Array

Código: Selecionar todos

aAdd(array,{'0001',10})
aAdd(array,{'0002',16})
aAdd(array,{'0003',2})
...
depois eu fazia um aScan buscando pelo 0002 para poder obter o valor 16.

Hash

Código: Selecionar todos

hTeste := hash()

hTeste['0001'] := 10
hTeste['0002'] := 16
hTeste['0003'] := 2
Entao para obter o 16 eu simplesmente faço referencia a chave no hash

Código: Selecionar todos

variavel_tal := hTeste['0002']
Inclusive na documentacao do xharbour explica bem, tem funcoes para testar se certa chave existe ou nao, funcao para buscar, clonar,etc.

Agora, eu gostaria saber se tem como usar um hash para substituir um array multicolunar?

tipo

Código: Selecionar todos

{{'001','TESTE',0},;
  {'002','TESTE2',10},;
  {'003','TESTE3,14}}
se for possivel, tem como buscar por exemplo TESTE3, mas com a mesma velocidade q obtive no exemplo anterior.

Espero que tenha conseguido me expresar melhor desta vez.
Meu portugues é tao bom escrito quando falado :))
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Ah, sim. Agora me toquei do que se trata. Me desculpe. Não é o algoritmo de hash, mas o tipo de dado hash; matriz associativa. Infelizmente não conheço nenhum material em português que explique isso a fundo, a não ser o que consta na Wikipedia em inglês. Clique aqui para ler. Mas se você tem tanta dificuldade no inglês, tente usar o tradutor de páginas do Google. Não fica uma maravilha, mas pode ajudar. :)


PS: Pra um paraguaio, seu português está excelente. Melhor do que o de muitos brasileiros. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
hrodrigom
Usuário Nível 2
Usuário Nível 2
Mensagens: 63
Registrado em: 10 Nov 2007 08:04
Localização: Santa Rita - Paraguay

Mensagem por hrodrigom »

Maligno escreveu: Mas se você tem tanta dificuldade no inglês
Ate que me defendo no ingles,
meu problema esta em encontrar documentacao adequada sobre o tema.

Mas mesmo assim, obrigado pelas respostas.
Vou ler o link que me enviastes..

Mas se algum dia vc obter alguma informacao relevante, favor poste no forum. Obrigado

Saudacoes
Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Mensagem por Luciano Bonfim »

já tentou criar uma matriz associativa onde o resultavo dela é a linha do seu array de várias colunas..

assim vc cria o seu "hash" como no exemplo que vc disse porem retornando a linha correta do seu array, ai basta pegar as outras informacoes diretamente no array

Código: Selecionar todos


{{'001','TESTE',0},; 
{'002','TESTE2',10},; 
{'003','TESTE3,14}}

hTeste := hash() 

hTeste['TESTE'] := 1
hTeste['TESTE2'] := 2 
hTeste['TESTE3'] := 3

Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
hrodrigom
Usuário Nível 2
Usuário Nível 2
Mensagens: 63
Registrado em: 10 Nov 2007 08:04
Localização: Santa Rita - Paraguay

Mensagem por hrodrigom »

Luciano Bonfim escreveu:já tentou criar uma matriz associativa onde o resultavo dela é a linha do seu array de várias colunas..
Eu ja tive essa ideia,
Mas no caso vou ter q ter um hash para cada coluna que eu queira pesquisar.
e se eu quiser reordenar o array vou ter que recriar o hash.

Entao deve ser isso mesmo, eu é que fiquei imaginando a posibilidade de ter um hash com multi-chaves, nao sei se seria essa a expresao correta.

Mas valeu pela resposta.
Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Mensagem por Luciano Bonfim »

Amigo,

anos atrás eu tive o mesmo problema que vc por causa da demora do ASCAN, eu criei uma rotina que faz uma busca binária no array muito mais rápida que o ASCAN. se quiser te passo ela
Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Mensagem por Luciano Bonfim »

lembrando que o array devera estar ordenado pela coluna que vc quer pesquisar.

Código: Selecionar todos


mlinha=buscabin(srchstr,aArray,col_pesq)

function buscabin(mbuscab,a,mcolb)
local i,low,high,mid,mtam_plv,x
low=1
high=len(a)
if high=0
   return(0)
endif
mid=int((low+high)/2)
mtam_plv=len(mbuscab)
do while substr(a[mid,mcolb],1,mtam_plv)#mbuscab .and. low<=high
   if mbuscab>substr(a[mid,mcolb],1,mtam_plv)
      low=mid+1
   else
      high=mid-1
      if high<1
         return(0)
      endif
   endif
   mid=int((low+high)/2)
enddo
if substr(a[mid,mcolb],1,mtam_plv)#mbuscab
   mid=0
else
   for x=mid-1 to 1 step -1
      if substr(a[x,mcolb],1,mtam_plv)=mbuscab
         mid=x
      else
         exit
      endif
   next
endif
return(mid)


Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
hrodrigom
Usuário Nível 2
Usuário Nível 2
Mensagens: 63
Registrado em: 10 Nov 2007 08:04
Localização: Santa Rita - Paraguay

Mensagem por hrodrigom »

Obrigado pela Rotina, sera de utilidade.

Saudacoes
____________________
Rodrigo Machado
FlaRo Sistemas
http://www.flaro.net
Responder