Drupal allows you to use those characters in a function name. In fact the DRUPAL_PHP_FUNCTION_PATTERN constant is defined as follows.
In your case, the problem is that the short name of the module would not match with initial part of the function name. If the short name of the module is isys_helper, then every hook implemented by that module must have a name that starts with isys_helper_. You cannot have a module called isys_helper for which the hook is called
The name collision happens when Drupal is not able to understand for which module the function is a hook implementation, and for which hook.
Suppose you create a module called user_node.module that defines a new content type, for which it implements
hook_view(). The function implementing that hook for that module would be called
user_node_view(), but that would be also the name for
hook_node_view() implemented from the User module. This means that the following code would
user_node_view() twice, provided that both user_node.module, and user.module are enabled.
// Call any implementation of hook_view().
$node = module_invoke_all('view', $node, $view_mode);
// Call any implementation of hook_node_view().
module_invoke_all('node_view', $node, $view_mode, $langcode);
Surely using underscores in the short name of a module doesn't help, but the solution is not to prefix the name of a hook with a string that is different from the one Drupal is expecting.
Solutions have been proposed to avoid issues, such as using two underscores to separate the module name from the hook name. In the example I made the implementation of
hook_node_view() made from the User module would be called
user__node_view() while the implementation of
hook_view() for the other module would be
user_node__view(). In this way, the ambiguity would be avoided.
Another proposal has been to use PHP 5.3 namespaces, but it is probable that even with Drupal 8 the hook names will follow the same schema used in other Drupal versions.