Well, at first you need a Disassembler like IDA, to analyze the binary.
Every compiled function has a signature. You can think of a signature as a unique byte pattern after the binary executable file is loaded into memory. But signatures are a bit trickier to create, because the function signature alone is most times not enough (I think), so you need some bytes from the function body too or the surrounding, and those bytes can vary, so you need to replace them with placeholders, that needs some basic assembler knowledge, more info:
https://wiki.alliedmods.net/Signature_scanning
Offsets on the other side are much easier, because all you need to know to identify a unique function is the class of the object (in C++ mangled format, like _ZTV13CTerrorPlayer) and the virtual function index. _ZTV13CTerrorPlayer is encoded name and means "Virtual table of class CTerrorPlayer".
Offsets are much easier to find because you can just read the Vtable index of a class, but they also often break very fast because new functions are added, or functions are removed, and then the offsets is not correct anymore... more info:
https://forums.alliedmods.net/showthread.php?t=191171
https://forums.alliedmods.net/showthread.php?t=191328
As a beginner, you will most times want to use the offset because it's easier to find.
__________________