Exponential-Golomb coding

An exponential-Golomb code (or just Exp-Golomb code) is a type of universal code. To encode any nonnegative integer x using the exp-Golomb code:

  1. Write down x+1 in binary
  2. Count the bits written, subtract one, and write that number of starting zero bits preceding the previous bit string.

The first few values of the code are:

 0 ⇒ 1 ⇒ 1
 1 ⇒ 10 ⇒ 010
 2 ⇒ 11 ⇒ 011
 3 ⇒ 100 ⇒ 00100
 4 ⇒ 101 ⇒ 00101
 5 ⇒ 110 ⇒ 00110
 6 ⇒ 111 ⇒ 00111
 7 ⇒ 1000 ⇒ 0001000
 8 ⇒ 1001 ⇒ 0001001
...[1]

This is identical to the Elias gamma code of x+1, allowing it to encode 0.[2]

Extension to negative numbers

Exp-Golomb coding is used in the H.264/MPEG-4 AVC and H.265 High Efficiency Video Coding video compression standards, in which there is also a variation for the coding of signed numbers by assigning the value 0 to the binary codeword '0' and assigning subsequent codewords to input values of increasing magnitude (and alternating sign, if the field can contain a negative number):

 0 ⇒ 0 ⇒ 1 ⇒ 1
 1 ⇒ 1 ⇒ 10 ⇒ 010
−1 ⇒ 2 ⇒ 11 ⇒ 011
 2 ⇒ 3 ⇒ 100 ⇒ 00100
−2 ⇒ 4 ⇒ 101 ⇒ 00101
 3 ⇒ 5 ⇒ 110 ⇒ 00110
−3 ⇒ 6 ⇒ 111 ⇒ 00111
 4 ⇒ 7 ⇒ 1000 ⇒ 0001000
−4 ⇒ 8 ⇒ 1001 ⇒ 0001001
...[1]

In other words, a non-positive integer x≤0 is mapped to an even integer −2x, while a positive integer x>0 is mapped to an odd integer 2x−1.

Exp-Golomb coding is also used in the Dirac video codec.[3]

Generalization to order k

To encode larger numbers in fewer bits (at the expense of using more bits to encode smaller numbers), this can be generalized using a nonnegative integer parameter  k. To encode a nonnegative integer x in an order-k exp-Golomb code:

  1. Encode ⌊x/2k⌋ using order-0 exp-Golomb code described above, then
  2. Encode x mod 2k in binary

An equivalent way of expressing this is:

  1. Encode x+2k−1 using the order-0 exp-Golomb code (i.e. encode x+2k using the Elias gamma code), then
  2. Delete k leading zero bits from the encoding result
Exp-Golomb-k coding examples
 x k=0k=1k=2k=3  x k=0k=1k=2k=3  x k=0k=1k=2k=3
01101001000 10000101100110001110010010 20000010101000101100011000011100
1010111011001 11000110000110101111010011 21000010110000101110011001011101
201101001101010 1200011010011100010000010100 22000010111000110000011010011110
30010001011111011 1300011100011110010001010101 23000011000000110010011011011111
4001010110010001100 140001111000100000010010010110 2400001100100011010001110000100000
5001100111010011101 15000010000000100010010011010111 2500001101000011011001110100100001
600111001000010101110 16000010001000100100010100011000 2600001101100011100001111000100010
70001000001001010111111 17000010010000100110010101011001 2700001110000011101001111100100011
8000100100101001100010000 18000010011000101000010110011010 280000111010001111000010000000100100
9000101000101101101010001 19000010100000101010010111011011 290000111100001111100010000100100101
gollark: Even if you reverse-engineer where it gets the hashes from and how it operates, by the nature of the thing you couldn't work out what was being detected without already having samples of it in the first place.
gollark: Anyway, the generality of this solution and the fact that they'll probably keep the exact details private for "security"-through-obscurity reasons also means that, as I have written here (https://osmarks.net/osbill/) in a blog post tangentially mentioning it, someone could just feed it hashes for, say, anti-government memes and find out who is saving those.
gollark: Although I suppose that *someone* probably keeps the originals around in case they have to change the hashing algorithm.
gollark: It's trickier on images (see how PyroBot does it...) but not impossible. (since you want moderately fuzzy matching, unlike SHA256 and such, which will produce an entirely different hash if a single bit is flipped)
gollark: Through the magic of cryptography, you can condense arbitrarily big files down to a fixed-length fingerprint and check if that matches, with basically-zero false positive risk.

See also

References

  1. Richardson, Iain (2010). The H.264 Advanced Video Compression Standard. Wiley. pp. 208, 221. ISBN 978-0-470-51692-8.
  2. Rupp, Markus (2009). Video and Multimedia Transmissions over Cellular Networks: Analysis, Modelling and Optimization in Live 3G Mobile Networks. Wiley. p. 149.
  3. "Dirac Specification" (PDF). BBC. Archived from the original (PDF) on 2015-05-03. Retrieved 9 March 2011.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.