Skip to content

Instantly share code, notes, and snippets.

@globby
Created March 4, 2014 00:35
Show Gist options
  • Save globby/9337839 to your computer and use it in GitHub Desktop.
Save globby/9337839 to your computer and use it in GitHub Desktop.
The Fletcher16, Fletcher32 and Fletcher64 algorithms
def Fletcher16(string):
a = map(ord,string)
b = [sum(a[:i])%255 for i in range(len(a)+1)]
return (sum(b) << 8) | max(b)
def Fletcher32(string):
a = map(ord,string)
b = [sum(a[:i])%65535 for i in range(len(a)+1)]
return (sum(b) << 16) | max(b)
def Fletcher64(string):
a = map(ord,string)
b = [sum(a[:i])%4294967295 for i in range(len(a)+1)]
return (sum(b) << 32) | max(b)
@orangecms
Copy link

The above function returns the integer representation, not a string.

You can convert around, e.g., using Python's binascii.hexlify after conversion to bytes:

f = fletcher32("python")
f_bytes = f.to_bytes(4, byteorder='big')
binascii.hexlify(f_bytes)

see also https://docs.python.org/3/library/binascii.html#binascii.hexlify

Another neat web tool for all sorts of things is the GCHQ's CyberChef.
https://gchq.github.io/CyberChef/#recipe=Fletcher-32_Checksum() prints you the hexadecimal representation as well.

@orangecms
Copy link

For long inputs, this doesn't seem to work though. I compared the output against CyberChef's for the first paragraph from cipsum.com.

@orangecms
Copy link

@mrx23dot
Copy link

I think you have to apply modulo before summing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment