Quels caractères sont les plus courants dans mon hachage MD2?


11

Le défi est simple

Écrivez un script qui, lorsqu'il reçoit une entrée de chaîne, hachera la chaîne à l'aide de l' algorithme de hachage MD2 , puis renverra soit un entier positif soit une sortie entière négative en fonction du jeu de caractères ci-dessous plus courant dans le hachage résultant sous la forme d'une chaîne hexadécimale:

01234567 - (positive)
89abcdef - (negative)
  • L'entrée sera toujours une chaîne, mais peut être de n'importe quelle longueur jusqu'à 65535
  • L'entrée entière, espace blanc et tout, doit être hachée
  • Aux fins de ce défi, l'entier 0 n'est considéré ni positif ni négatif (voir sortie liée)
  • L'ensemble le plus courant est celui dont les caractères sont plus courants dans la chaîne de hachage hexadécimale à 32 caractères
  • Votre sortie peut contenir des espaces de fin de tout type, tant que les seuls caractères non blancs sont une sortie true ou falsey valide
  • En cas d'égalité, où la chaîne hexadécimale contient exactement 16 caractères de chaque ensemble, le programme doit sortir un 0

Exemples d'E / S

Input: "" (Empty String)
Hash: 8350e5a3e24c153df2275c9f80692773
Output: 1

Input: "The quick brown fox jumps over the lazy cog" (Without quotes)
Hash: 6b890c9292668cdbbfda00a4ebf31f05
Output: -1

Input: "m" (Without quotes)
Hash: f720d455eab8b92f03ddc7868a934417
Output: 0

Critère gagnant

C'est le , le moins d'octets gagne!


1
Il serait bon de lier ou d'expliquer idéalement l'algorithme de hachage MD2 dans la spécification de défi pour le rendre autonome.
Martin Ender

@MartinEnder fera l'affaire!
Skidsdev

Je pense qu'il serait juste d'accepter simplement trois valeurs distinctes pour gagner , perdre et égaler
junkie mathématique

@mathjunkie true, ne devrait probablement pas changer tellement les spécifications, mais je suppose qu'avoir 1, 0 ou -1 est le meilleur moyen
Skidsdev

2
Cela me semble être un défi de caméléon . Soit votre langue a un build ou une bibliothèque pour faire MD2 et le reste est un simple comptage de caractères, soit ce n'est pas le cas et vous devez l'implémenter vous-même.
xnor

Réponses:


1

Octave, 35 octets

@(s)diff(hist(hash('md2',s),+'78'))

* Nécessite la dernière version d'Octave (au moins 4.2).

Calcule les décomptes historiques de la chaîne de hachage avec son centre de casiers sont 7 et 8 puis calcule la différence de décomptes.


Étant donné que cela fait quelques jours, je proposerai la vôtre comme réponse gagnante, si quelqu'un arrive plus tard avec une solution plus courte, je peux toujours la changer. Bien joué!
Skidsdev

@Mayube Merci!
rahnema1

8

Mathematica, 43 octets

Tr@Sign[15-2#~Hash~"MD2"~IntegerDigits~16]&

Affiche le nombre de chiffres en 01234567moins le nombre de chiffres en 89abcdef.


1
Dommage c'est 3Eentre 8 et 9 et pas entre 7 et 8.: |
Martin Ender

8

JavaScript (ES6), 731 octets

Ce monstre implémente l'algorithme MD2, il est donc d'une longueur embarrassante. Basé sur js-md2 par Chen Yi-Cyuan.

let f =

m=>{L=x=s=b=0,n=m.length,M=[],X=[],C=[],S=[...atob`KS5DyaLYfAE9NlSh7PAGE2KnBfPAx3OMmJMr2bxMgsoem1c8/dTgFmdCbxiKF+USvk7E1tqe3kmg+/WOuy/ueqloeZEVsgc/lMIQiQsiXyGAf12aWpAyJzU+zOe/95cD/xkws0iltdHXXpIqrFaqxk+4ONKWpH22dvxr4px0BPFFnXBZZHGHIIZbz2XmLagCG2Alra6wufYcRmFpNEB+D1VHoyPdUa86w1z5zrrF6iYsUw1uhSiECdPfzfRBgU1Satw3yGzBq/ok4XsIDL2xSniIlYvjY+ht6cvV/jsAHTny77cOZljQ5KZ3cvjrdUsKMURQtI/tHxrbmY0znxGDFA`].map(c=>c[O='charCodeAt']());for(l=1;l-2;){for(j=19;j--;)M[j]=M[16+j]||0;for(i=s;i<16;x++)L=(x-n||(b+=i-s,s=i-16,l=2),C[i]^=S[(M[i++]=x<n?m[O](x):16-(b&15))^L]);for(i=0;i<l;i++){for(j=16;j--;)X[32+j]=(X[16+j]=(i?C:M)[j])^X[j];for(t=j=0;j<18;t=t+j++&255)for(k=0;k<48;)t=X[k++]^=S[t]}}for(i=16,n=-i;i--;)n+=!(X[i]&8)+!(X[i]&128);return n}

console.log(f(''))
console.log(f('The quick brown fox jumps over the lazy cog'))
console.log(f('m'))


Battez-moi. Un effort vraiment sympa.
Luke

Props pour, jusqu'à présent, être le seul à réellement implémenter l'algorithme MD2 complet plutôt que d'utiliser des fonctions intégrées.
Skidsdev

Réponse en octets les plus élevés méritant plus de points.
Urne de poulpe magique

5

Python 2 + Crypto , 108 99 93 91 87 78 octets

Python n'a pas de fonction native pour MD2.

from Crypto.Hash import*
lambda s:sum(x<'8'for x in MD2.new(s).hexdigest())-16

12 octets enregistrés grâce à @ovs.
9 octets enregistrés grâce à @FelipeNardiBatista.


lambda s:cmp(sum((int(x,16)<8)-.5for x in MD2.new(s).hexdigest()),0)devrait réduire le nombre d'octets à 93
ovs

@ovs Très intelligent!
mbomb007

sum(x<'8'for x ......
Felipe Nardi Batista

lambda s:sum(x<'8'for x in MD2.new(s).hexdigest())-16pour 78. la sortie peut être n'importe quel nombre, pas seulement-1,0,1
Felipe Nardi Batista

4

Java 8, 173 octets

-4 merci à dzaima

-128 grâce à Oliver, c'est essentiellement sa réponse maintenant.

a->{String h="";for(byte b:java.security.MessageDigest.getInstance("MD2").digest(a.ge‌​tBytes()))h+=h.forma‌​t("%02x",b);return h.codePoints().filter(c->c>47&&c<56).count()-16;}

Positif pour véridique. Négatif pour falsification. 0 pour 0.


1
Vous pouvez économiser 4 octets en supprimant les crochets de forif
fermeture

1
octets hex peut être golfed: String s="";for(byte b:bytes)h+=h.format("%02x",b);. En outre, vous n'avez pas besoin d'écrire un programme complet, mais un lambda suffisent: a->{... return x;}. Enfin la boucle for peut être remplacée par int x=s.codePoints().filter(c->c>47&&c<56).count();. Dans l' ensemble, je reçois 173 pour votre algorithme, golfed: a->{String h="";for(byte b:java.security.MessageDigest.getInstance("MD2").digest(a.getBytes()))h+=h.format("%02x",b);return h.codePoints().filter(c->c>47&&c<56).count()-16;}. Plus de golf est possible, mais c'est une nette amélioration du nombre d'octets, n'est-ce pas?
Olivier Grégoire

Quelques choses au golf: println-> printet for(char c:s.toCharArray())if("01234567".contains(""+c))x++;->for(String c:s.split(""))if("01234567".contains(c))x++;
Kevin Cruijssen

@ OlivierGrégoire Je ne connais pas grand chose à Java 8, je suis passé à Groovy / Grails à la même époque.
Urne de poulpe magique du

3

PHP, 50 octets

imprime 1 pour vrai et -1 pour faux et 0 pour une cravate

<?=preg_match_all("#[0-7]#",hash(md2,$argn))<=>16;

PHP, 58 octets

imprime 1 pour vrai et -1 pour faux et 0 pour une cravate

<?=16<=>strlen(preg_filter("#[0-7]#","",hash(md2,$argn)));

Désolé pour tous les changements de spécifications, les exigences de sortie finales sont maintenant disponibles. Fondamentalement, ce que vous avez actuellement mais inversé (1 pour truey, -1 pour falsey) qui devrait être assez facile comme iirc en PHP-0 === 0
Skidsdev

@Mayube c'est trop long 1 octet de plus est suffisant. La meilleure façon est de spécifier la sortie par les possibilités de la langue et non par général
Jörg Hülsermann

1
echo 16<=>strlen(preg_filter("#[0-7]#","",hash(md2,$argn)));devrait faire l'affaire sans octet supplémentaire.
Christoph

1
Version golfée:<?=preg_match_all("/[0-7]/",hash(md2,$argn))<=>16;
Christoph

@Christoph Je me sens comme un idiot auquel je n'ai pas pensé à preg_match_all
Jörg Hülsermann

1

PHP, 56 octets

while($i<32)${hash(md2,$argn)[$i++]>'7'}++;echo$$_<=>16;

1

Java 137 130 124 123 123 octets

a->{int c=32;for(int b:java.security.MessageDigest.getInstance("MD2").digest(a.getBytes()))c-=(b>>6&2)+(b>>2&2);return c;}

Testez-le en ligne!

Fondamentalement, pour chaque octet, il nous est demandé de vérifier ses 4e et 8e bits les moins significatifs. Je ne passe pas du tout par la représentation hexadécimale. Il semblait donc tout naturel de commencer à jouer avec des bits.

Les valeurs <0sont falsey, les valeurs >0sont véridiques, la valeur 0n'est ni véridique ni falsey. La vérité et le falsey habituels ne peuvent pas être appliqués à Java cette fois (parce que ce ne peut pas être trueou falseou 0avec la règle if(<truthy>)), j'ai donc pris la liberté de le déclarer comme tel.

Sauvegarde

  1. 137 -> 130 octets: joué au golf à l'aide d'opérations sur les bits, en supprimant 2 à chaque fois que j'obtiens un bit "falsifié".
  2. 130 -> 124 octets: opérations plus au niveau du bit
  3. 124 -> 123 octets: remplacé bytepar intdans la déclaration de boucle for.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.